我有以下代码,似乎无法正常工作。

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

08-04 21:26