我有以下代码,似乎无法正常工作。
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,我们用Manufacturing (job_no, assembly_id, etc..)
(查询中的assembly_id
)查找表job_no
来查找jobno
,这是主键,我们已经计算了从一开始就。一旦找到assembly_id
,它将用于区分所有Assembly_Acc
(恰好具有唯一的assembly_id
)我希望这听起来并不复杂,但是您能帮助我做得更好吗?我真的很急,我不确定该怎么做。
最佳答案
您的PL / SQL代码应放入存储过程中,然后Java CallableStatement将调用该过程,并以参数transno,jobno和supcost的形式传递。
看到这个问题:
PreparedStatements or callableStatements