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窗口查询完毕点下拉(获取最后页)时候卡住,要很久才执行完,求解决办法。

PL/SQL 查询多个数据库上的表

角色卡住走路

由于配置错误,iOS 应用 Ad Hoc 安装卡住

PL/SQL noob 语法错误

Hibernate卡住,然后报错java.sql.SQLException: Unknown system variable 'language'异常