2017-01-13 3 views
5

getan, was ich eine Störung erhalte, die weiter unten sehen kann, wenn ich die Abfrage vorbereite:SQL: Vorbereitung der SQL-Abfrage schlägt fehl. Aber ausgeführt wird, wenn manuell

SQL-ERR:Preparation of INSERT Query Failed: Ora-Err: -1756 ORA-01756: 
quoted string not properly terminated 

Die Abfrage lautet wie folgt:

EXEC SQL declare INSDTA STATEMENT; 
EXEC SQL PREPARE INSDTA FROM :stmt; 
if(sqlca.sqlcode < 0) 
{ 
    DEBUG_LOG("SQL-ERR:Preparation of INSERT Query Failed: Ora-Err: %d %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); 
    DEBUG_LOG("The Query is: %s\n", insertQuery); 
    return PREPARATION_FAILURE; 
} 

und die Abfrage von der Protokolldatei ist:

INSERT INTO TABLENAME 
VALUES (
    '00000001', 
    '00004467', 
    '0', 
    'R56565', 
    '03404395', 
    '20110601', 
    '999', 
    '87685785', 
    '2017-01-10-23.05.26.000000', 
    'KRMAR', 
    'KRMAR', 
    '77898878', 
    '03', 
    '00000001', 
    'U', 
    '01', 
    '1', 
    '87685785', 
    'R56565', 
    '89878988', 
    'cde', 
    'Andr\351', 
    '[email protected]', 
    '01192966', 
    'HGJF', 
    '00000000', 
    '', 
    '900429', 
    '1', 
    '98989897', 
    '', 
    'Aargau/Solothurn (CIC)', 
    'VCD', 
    'RB9', 
    'VCD', 
    'Observer' 
    ) 

Wenn ich es manuell ausführe, werden die Daten eingefügt.

Aber programmatisch versagt es für viele solcher Reihen.

Beachten Sie, dass der Eingabetext für die Einfügeabfrage spezielle Zeichen wie é, ü enthält.

Auch das gleiche Programm arbeitet perfekt am Entwicklungssystem. Aber bei der Produktion versagt es.

Das manuelle Einfügen funktioniert ordnungsgemäß.

Was könnte das Problem sein? Irgendwelche Konfigurationsprobleme?

Vielen Dank im Voraus.

+1

können Sie versuchen, null statt leere Zeichenfolgen? in der Regel zwei Zitat für Orakel os ein Zitat zu entkommen. – Walfrat

+0

okay, werde es versuchen. Erraten Sie andere Probleme? – NJMR

+0

scheint nicht so. – Walfrat

Antwort

3

Da \ ist das Escape-Zeichen, ich denke, der Fehler kommt von 'Andr\351', die wahrscheinlich 'André' sein sollte.

Entfernen Sie Backslash-Zeichen aus Ihrer Abfrage, nur um zu überprüfen, ob dies der wahre Grund ist.

+0

Aber die gleiche Abfrage funktioniert auf dem lokalen System. Überprüfe die Logs im lokalen Dev-System, wie die speziellen Zeichen behandelt werden. Ich melde mich dazu bei dir. Danke für die Antwort. – NJMR

+0

@NJMR könnte es sein, dass Sie nicht mit den gleichen Parametern/Konfiguration verbunden sind (Benutzer, Verbindungsstring-Parameter, etc.) –

2

Es besteht ein grundlegender Unterschied zwischen der manuellen Ausführung einer Abfrage und der Verwendung von dynamischem SQL zur Vorbereitung einer Abfrage mit Bindevariablen für die mehrfache Ausführung mit verschiedenen Parametern.

Hier ist ein guter Überblick über Dynamic SQL Statements. Was Sie besonders nützlich finden, ist der Abschnitt zum Vorbereiten von dynamischen SQL-Anweisungen - insbesondere die Details zu Platzhaltern in Oracle und der Abschnitt zum Ausführen von dynamischen SQL-Anweisungen.

Es ist schwer zu sagen, was das Problem sein könnte, ohne die dynamische SQL-Anweisung zu sehen, die Sie verwenden, und wie Sie Ihre Platzhalter deklarieren.

Einige Hinweise:

  • Es scheint, dass Sie eine Variable verwenden, wenn Sie mehrere Werte einfügen versuchen. In Oracle muss zu dem Zeitpunkt, an dem die Anweisung ausgeführt wird, für jeden Platzhalter eine Variable vorhanden sein.

  • Die von Ihnen angezeigte Prozedur ist nicht vollständig.

    • Wie sieht die Abfrage in :stmt aus?
    • Wie sehen Ihre Platzhalter aus? Sind Saiten korrekt zitiert?
    • Was sind die Werte in den Variablen, die Sie für die Platzhalter verwenden?

    • Ihre Anweisung fehlt END-EXEC

Beispiel von oben Quelle entnommen:

move "INSERT INTO publishers " & 
      "VALUES (?,?,?,?)" to stmtbuf 
EXEC SQL 
    PREPARE stmt1 FROM :stmtbuf 
END-EXEC 
    ... 
EXEC SQL 
    EXECUTE stmt1 USING :pubid,:pubname,:city,:state 
END-EXEC 
0

entfernen alles (‘‚) von ganzzahligen Werten

0

Ihre Anfrage ist fehlgeschlagen, weil spac vorwärts e im Spaltenwert "Aargau/Solothurn (CIC)". Die Rücktaste ist ein Sonderzeichen, so dass Sie entweder die Rücktaste verwenden oder sie entfernen müssen. Dann können Sie es erfolgreich ausführen.

Verwandte Themen