简体   繁体   English

ORACLE)更新查询为什么不起作用?

[英]ORACLE) update query Why doesn't it work?

this is procedure in oracle pakage update query Why doesn't it work? 这是oracle pakage更新查询中的过程为什么它不起作用?

create or replace PACKAGE BODY SAP_MATERIALMASTER_PKG IS

 PROCEDURE SAP_MATERIALMASTER_INS (
    TRANS_REF_NO   IN NUMBER,
    MATERIAL   IN VARCHAR2,
    UNIT_OF_MEASURE   IN CHAR )
      IS
      cnt NUMBER := 0;   
      BEGIN

        --insert or update 구분을 위한 동작
          select COUNT(*) into cnt from SAP_MATERIAL
          where
          material = MATERIAL;

        if cnt = 0 then 

          INSERT INTO SAP_MATERIAL(
          TRANS_REF_NO,MATERIAL,UNIT_OF_MEASURE
          ) 
          VALUES(TRANS_REF_NO,MATERIAL,UNIT_OF_MEASURE); commit;

        else

          UPDATE SAP_MATERIAL
          SET
          TRANS_REF_NO = TRANS_REF_NO, 
          MATERIAL = MATERIAL,
          UNIT_OF_MEASURE = UNIT_OF_MEASURE
          WHERE MATERIAL = MATERIAL;
          commit;
        end if;

      END SAP_MATERIALMASTER_INS;

 END  SAP_MATERIALMASTER_PKG;

Fix your parameters! 修正您的参数! They need to differ from the column names. 它们需要与列名不同。 I recommend a prefix, in this case in_ to indicate that these are "in" parameters: 我建议使用前缀in_以指示这些是“输入”参数:

PROCEDURE SAP_MATERIALMASTER_INS (
    in_TRANS_REF_NO   IN NUMBER,
    in_MATERIAL   IN VARCHAR2,
    in_UNIT_OF_MEASURE   IN CHAR
) as
cnt NUMBER := 0;   
BEGIN
    . . .
    UPDATE SAP_MATERIAL
         SET TRANS_REF_NO = in_TRANS_REF_NO, 
              UNIT_OF_MEASURE = in_UNIT_OF_MEASURE
          WHERE MATERIAL = in_MATERIAL;
     . . .

Along with @GordonLinoff's solution, might I suggest that you learn to use a MERGE statement? 连同@GordonLinoff的解决方案一起,我是否建议您学习使用MERGE语句? It's designed to do precisely what you're doing with less code: 它旨在使用更少的代码来精确地执行您正在做的事情:

PROCEDURE SAP_MATERIALMASTER_INS (pin_TRANS_REF_NO    IN NUMBER,
                                  pin_MATERIAL        IN VARCHAR2,
                                  pin_UNIT_OF_MEASURE IN CHAR )
  IS
  BEGIN
    MERGE INTO SAP_MATERIAL sm
      USING (SELECT pin_TRANS_REF_NO    AS P_TRANS_REF_NO,
                    pin_MATERIAL        AS P_MATERIAL,
                    pin_UNIT_OF_MEASURE AS P_UNIT_OF_MEASURE
               FROM DUAL) d
        ON (sm.MATERIAL = d.P_MATERIAL)
      WHEN NOT MATCHED THEN
        INSERT (TRANS_REF_NO,     MATERIAL,     UNIT_OF_MEASURE)
        VALUES (d.P_TRANS_REF_NO, d.P_MATERIAL, d.P_UNIT_OF_MEASURE)
      WHEN MATCHED THEN
        UPDATE
          SET sm.TRANS_REF_NO = d.P_TRANS_REF_NO,
              sm.UNIT_OF_MEASURE = d.P_UNIT_OF_MEASURE;

    COMMIT;
  END SAP_MATERIALMASTER_INS;

Plus, SELECT COUNT(*)... can be very slow. 另外, SELECT COUNT(*)...可能非常慢。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM