2017-01-13 68 views
5

我得到可當我準備下面的查詢可以看到一個錯誤時,執行:SQL:準備SQL查詢失敗。但手動完成

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

查詢如下:

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; 
} 

而且從查詢日誌文件是:

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' 
    ) 

如果我手動執行它,數據被插入。

但在編程上它是許多這樣的行失敗。

請注意,插入查詢的輸入文本包含特殊字符,如éü

此外,同樣的程序正在開發系統完美。但在製作上,它卻失敗了。

手動插入正在正常生產。

可能是什麼問題? 任何配置問題?

在此先感謝。

+1

你可以嘗試null而不是空字符串?通常oracle的兩個報價是爲了避免一個報價。 – Walfrat

+0

好吧,會嘗試。你猜猜還有其他問題嗎? – NJMR

+0

似乎並不如此。 – Walfrat

回答

3

由於\是轉義字符,我認爲錯誤來自'Andr\351'這應該是'André'

從查詢中刪除反斜槓字符只是爲了檢查這是否是真正的原因。

+0

但同樣的查詢正在本地系統上工作。讓我們來看看本地開發系統中的日誌,瞭解特殊字符如何處理。將在此回覆你。謝謝回覆。 – NJMR

+0

@NJMR它可能是你沒有連接相同的參數/配置(用戶,連接字符串參數等) –

2

手動執行查詢和使用動態SQL準備具有綁定變量的查詢以使用不同參數執行多次操作之間存在根本區別。

下面是關於Dynamic SQL Statements的一個很好的概述。您可能會發現特別有用的部分是關於準備動態SQL語句的部分 - 特別是有關Oracle中佔位符的詳細信息以及有關執行動態SQL語句的部分。

如果沒有看到您正在使用的動態SQL語句以及如何聲明佔位符,很難說出問題的原因。

一些指針:

  • 看來你正在使用一個變量,而試圖插入多個值。在Oracle中,執行語句時,每個佔位符必須有一個變量。

  • 您顯示的程序不完整。

    • :stmt中的查詢是什麼樣的?
    • 佔位符是什麼樣的?是否正確地引用了字符串?
    • 用於佔位符的變量中的值是什麼?

    • 你的語句丟失從上述源採取END-EXEC

實施例:

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

查詢中刪除所有(」「)正在失敗,因爲前鋒spac e'在'阿爾高/索洛圖恩(CIC)'欄中的值。退格是特殊字符,所以你需要照顧使用退格或刪除它。然後你將能夠成功執行它。