SQL:SQL查询的准备失败。但是在手动完成时执行

时间:2017-01-13 09:49:49

标签: sql oracle-pro-c

我收到的错误在我准备查询时可以看到:

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',
    'andre.rae@abc.com',
    '01192966',
    'HGJF',
    '00000000',
    '',
    '900429',
    '1',
    '98989897',
    '',
    'Aargau / Solothurn (CIC)',
    'VCD',
    'RB9',
    'VCD',
    'Observer'
    )

如果我手动执行,则会插入数据。

但是以编程方式,许多这样的行都失败了。

请注意,插入查询的输入文本包含éü等特殊字符。

此外,同一个程序正在完美地开发系统。但在制作方面,却失败了。

手动插入正在正常进行生产。

可能是什么问题? 任何配置问题?

提前致谢。

4 个答案:

答案 0 :(得分:3)

由于\是转义字符,我认为错误来自'Andr\351''André'可能是r'xyzA*12*pqR*stB*HS*lmN*opA*45*a4N*gB*SD*drtU*ghy'

从查询中删除反斜杠字符,以检查这是否是真正原因。

答案 1 :(得分: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

答案 2 :(得分:0)

从整数值

中删除所有(&#39;&#39;)

答案 3 :(得分:0)

您的查询失败,因为Aargau / Solothurn(CIC)&#39;列值。 Backspace是特殊字符,因此您需要使用退格键或完全删除它。然后你就能成功执行它。