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

SQL: Preparation of SQL query fails. But is executed when done manually

我在准备查询时遇到错误,如下所示:

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

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

但是对于许多这样的行,它以编程方式失败。

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

此外,同一个程序在开发系统上完美运行。但在生产上,它是失败的。

手动插入在生产环境中正常工作。

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

提前致谢。

由于\是转义字符,我认为错误来自'Andr1',应该是'André'.

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

手动执行查询与使用动态 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

从整数值中删除所有 (' ')

您的查询失败,因为在 'Aargau / Solothurn (CIC)' 列值中转发 space。 Backspace 是特殊字符,因此您需要注意使用 backspace 或完全删除它。然后就可以执行成功了。