【发布时间】: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