Java 上的 PL SQL 似乎卡住了
Posted
技术标签:
【中文标题】Java 上的 PL SQL 似乎卡住了【英文标题】:PL SQL on Java seems to be getting stuck 【发布时间】:2013-11-26 09:24:53 【问题描述】:我有以下代码,它似乎不起作用。
CallableStatement cs = dbc.prepareCall("" +
"DECLARE " +
"transno numeric (9,0); " +
"jobno numeric (9,0); " +
"supcost numeric (9,0); " +
"message varchar (20) := 'All good'; " +
"BEGIN " +
"transno := ?; " +
"jobno := ?; " +
"supcost := ?; " +
"INSERT INTO JOB_TRANSACTION" +
" VALUES (transno, jobno); " +
"INSERT INTO TRANSACTION " +
" VALUES (transno, supcost); " +
"UPDATE ASSEMBLY_ACC ac" +
" SET cost = cost + supcost " +
" WHERE EXISTS(SELECT * FROM Manufacturing m WHERE m.job_no = jobno and m.assembly_id = ac.assembly_id); " +
"? := message; " +
"END;");
cs.setInt(1, Integer.parseInt(trans_no));
cs.setInt(2, Integer.parseInt(job_no));
cs.setInt(3, Integer.parseInt(sup_cost));
cs.registerOutParameter(4, Types.VARCHAR);
cs.execute();
System.out.println(cs.getString(4));
其中 trans_no、job_no 和 sup_cost 都是已经包含值的字符串。
我认为它卡在了 UPDATE 语句中,但是我想不出另一种表达条件的方式。
我打算做的是,每次进行具有各自供应成本sup_cost
的交易时,它都会同时更新三个帐户的cost
,其中一个是Assembly_Acc (acc_no, assembly_id, cost)
(为简单起见,我们将只使用一个),并且为了知道要更新哪个 Assembly_Acc,我们使用作为主键的 assembly_id
查找表 Manufacturing (job_no, assembly_id, etc..)
和 job_no
(查询中的 jobno
)我们已经从头算起。一旦找到assembly_id
,它将用于区分所有Assembly_Acc
(恰好有一个唯一的assembly_id
)
我希望它听起来不复杂,但你能帮我把它做得更好吗?我真的很紧急,我不知道该怎么办。
【问题讨论】:
您是否单独检查过您的 SQL 语句,以确保它们正确并按照您的意愿行事? 我没有单独检查更新语句,但其他两个工作正常。数据库里面有很多key的引用,所以也有点难。 如果您说没有更新语句一切正常,我建议确保您的更新语句正常工作。不确定cost = cost + supcost
是否正常工作。可能类似于cost = (select cost from XY) + supcost
【参考方案1】:
您的 PL/SQL 代码应放入存储过程中,然后 java CallableStatement 将调用该过程并传入 transno、jobno 和 supcost 作为参数。
看到这个问题: PreparedStatements or callableStatements
【讨论】:
谢谢,虽然我没有读完,但我试了一下,它解决了问题。以上是关于Java 上的 PL SQL 似乎卡住了的主要内容,如果未能解决你的问题,请参考以下文章
pl/sqldeveloper工具的sql窗口查询完毕点下拉(获取最后页)时候卡住,要很久才执行完,求解决办法。
Hibernate卡住,然后报错java.sql.SQLException: Unknown system variable 'language'异常