【问题标题】:Character/String passed from java to stored procedure does not work从 java 传递到存储过程的字符/字符串不起作用
【发布时间】:2018-10-03 23:40:32
【问题描述】:

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

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

我得到的错误是 ORA-00904: "Y" invalid Identifier

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    在 PL/SQL 中赋值是 Pascal 风格的:=', not=`。除此之外,我认为此处显示的字符串连接没有任何问题。

    我怀疑sp_stat 稍后会用于编写动态 SQL。我会仔细查看正在生成的 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 || ''')';
                                   ^^               ^^
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多