使用来自 java 的值执行匿名 pl/sql 块文件

Posted

技术标签:

【中文标题】使用来自 java 的值执行匿名 pl/sql 块文件【英文标题】:execute anonymous pl/sql block file with values from java 【发布时间】:2014-03-18 09:17:20 【问题描述】:

我在一个 sql 文件中有一个匿名 pl/sql 块,我想在 Java 中执行它并为其赋值。我的 sql 块是这样的

    DECLARE

            someInput1 NUMBER(1);

            someInput2 NUMBER(2);

            someString1 VARCHAR(100);

    BEGIN

            someInput1 := ‘&1’;

            someInput2 := ‘&2’;

            --get name in table A

            BEGIN

                    SELECT a.value INTO someString1

                    FROM TABLE_A a

                    WHERE a.id = someInput1;               

            END;



            UPDATE TABLE_B b

            SET b.someStringRow = someString1

            WHERE b.someIntRow = someInput2;

            COMMIT;

    END;

    /

    exit;

我打算做的是在 Java 字符串中加载 sql 文件,将“&1”更改为 ?1 并将其作为 CallableStatement 执行。但是,我得到了

    PLS-00103: Encountered the symbol “” when expecting one of the following
    begin function package pragma procedure subtype us <an identifier> <a double quoted delimited identifier> form current cursor

DECLARE 部分的行发生错误

我的方法是可接受的解决方案吗?如果是,我的方法可能有什么问题?

对于我的问题,还有其他更好的解决方案吗?谢谢

【问题讨论】:

删除 &amp;1&amp;2 周围的引号。定义缺失的someString1 其实不需要局部变量,直接引用绑定变量即可。不过,您真的是指?1,而不仅仅是? 用于两个替换变量吗?它不会喜欢尾随的/exit;,尽管它应该这样说——你的真实代码是否有花引号,或者在你创建问题时已经引入了这些引号?但为什么这是一个 PL/SQL 块,还是两个 DML 语句? 我会将 & 替换为 ?这样我就可以使用 callableStatement.setInt(1, javaInt) ... 设置值,依此类推。 pl 块有更多语句,因为我正在使用电话,所以我无法输入它。另外,当我删除 &1 上的引号时,我得到了无效的列索引异常,正如 ravinder 所建议的那样 @FrankSmith - 你不需要给? 占位符编号;命令中的第一个将设置为setInt(1, ...),因为它们是位置未命名的。看起来您已经删除了替换变量周围的引号。您遗漏的其余错误可能会有所帮助,但我怀疑它对 /exit; 不满意。 我尝试将所有 &number 更改为 ?并删除 / 并退出;我忘了提到我仍在使用 jdk 1.5 虽然我不知道它有影响 【参考方案1】:

你必须删除引号,并将&amp;1替换为:1,你应该没问题,你还需要删除'/'exit;,它们与sqlplus相关而不是@ 987654326@直接

【讨论】:

以上是关于使用来自 java 的值执行匿名 pl/sql 块文件的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL语法简介(匿名PL/SQL块)

PL/SQL ORA-01422 SELECT INTO 错误,Oracle 匿名块(NOVA 环境)

PL/SQL 匿名块已完成”但未显示结果

从 Oracle PL/SQL 匿名块填充 C# 数据表

PL/SQL数据库开发那点事

PL/SQL 过程块