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