从java传递到存储过程的字符/字符串不起作用

时间:2018-04-23 20:19:06

标签: sql stored-procedures oracle11g java-stored-procedures

您好我有一个存储过程,它接受来自java的参数“Q_RES”。它的值是“Y”或“N”。在我的存储过程中,我有一个条件

If Q_RES = 'Y' THEN
    sp_stat = 'TABLENAME.RES  IN (' || Q_RES || ')';
END IF

坚果我得到错误有ORA-00904:“Y”无效标识符

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

在PL / SQL中,赋值是Pascal样式:=', not =`。除此之外,我没有看到这里显示的字符串连接有任何问题。

我怀疑稍后在编写动态SQL时会使用sp_stat。我将仔细研究正在生成的SQL。它可能看起来像这样:

... TABLENAME.RES IN (Y) ...

如果将其解释为SQL文本,Oracle会将裸字Y视为标识符,例如列名,并尝试解决该问题。 (如果查询中引用的表具有名为Y的列,则查询不会引发有关无效标识符的错误。

在这里猜测,但我怀疑我们希望Y是一个字符串文字。字符串文字用单引号括起来,如下所示:

... TABLENAME.RES IN ('Y') ...

要在字符串文字中获取单引号,我们可以使用两个单引号,例如

'I''m happy this is working'

由于我们已经知道Q_RES等于'Y',为什么不这样做:

sp_stat := 'TABLENAME.RES  IN (''Y'')';
                               ^^ ^^ 

或者,如果我们想引用Q_RES,请将其用单引号括起来,如下所示:

sp_stat := 'TABLENAME.RES  IN (''' || Q_RES || ''')';
                               ^^               ^^