2017-01-13 46 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)'栏中的值。退格是特殊字符,所以你需要照顾使用退格或删除它。然后你将能够成功执行它。