【问题标题】:I'm trying to print the value of sql query but it is print different value我正在尝试打印 sql 查询的值,但它打印的是不同的值
【发布时间】:2016-05-16 20:08:31
【问题描述】:

我创建了一个存储过程,我在其中卡住了,我正在尝试打印 REC_STAT 的值,但另一方面,当我每次尝试获取 ab、ab1 和ver_dosage 我可以打印这些值,但是 REC.REC_STAT 有问题,它是通过 dbms_output.put_line 打印空白值,但它是这样打印的 REC。

declare

EXT_PHARMA_ID varchar2(10) := 'MCL_051270';

begin

TEST_SP('T_MCL_051270_20160314_0019057','MCL',EXT_PHARMA_ID,'0');

end;

/

DBMS_OUTPUT.PUT_LINE 是这样打印的

REC
REC
REC
REC

存储过程:-

CREATE OR REPLACE PROCEDURE TEST_SP(Dy_File_Name    IN     VARCHAR2,
                                              SUPPLIER_CD     IN      VARCHAR2,
                                              EXT_PHARMA_ID   IN OUT    VARCHAR2,
                                              FLAG_VALUE      IN     VARCHAR2)
    AS

            CLREF            SYS_REFCURSOR;

        TYPE REC_TYP IS RECORD

           (

           AB                 VARCHAR2(256) ,
           AB1                VARCHAR2(256) ,  
           AB2                NUMBER(20),
           REC_STAT           VARCHAR2(9),
           VER_DOSAGE         VARCHAR2(20),

        OPEN CLREF FOR ('SELECT
                  S.ABC AS AB,
              S.ABC1 AS AB1,
              S.ABC2 AS AB2,
                  S.VERBOSE_DOSAGE                AS VER_DOSAGE,
                  CASE WHEN S.DEL_IND = 1 AND H.DEL_IND = 0 THEN ''DEL''
                       WHEN S.DEL_IND = 1 AND H.DEL_IND IS NULL THEN ''DEL_IGNR''
                       WHEN S.DETL_CLMNS_HASH <> H.DETL_CLMNS_HASH THEN ''UPDT''
                       WHEN S.DETL_CLMNS_HASH = H.DETL_CLMNS_HASH THEN ''DUPL''
                       WHEN S.DETL_CLMNS_HASH = S.DETL_CLMNS_HASH THEN ''REC''
                       WHEN H.DETL_CLMNS_HASH IS NULL THEN ''NEW''
                       ELSE ''ERR'' END AS REC_STAT

                FROM
                  (SELECT stg.*,
                    row_number() over ( partition BY key_clmns_hash, rx_dspnsd_dt, del_ind ORDER BY 1) AS RN
                  FROM  '   || Dy_File_Name || '   stg
                  ) s
                LEFT JOIN ps_pharmacy p ON s.extrnl_pharmacy_id = p.extrnl_pharmacy_id  
                LEFT JOIN ps_rx_hist H
                ON h.key_clmns_hash        = s.key_clmnS_hash
                AND h.rx_dspnsd_dt         = s.rx_dspnsd_dt
                AND s.supplier_pharmacy_cd = h.SUPPLIER_PHARMACY_CD
                WHERE s.RN                 = 1')


        LOOP


              FETCH CLREF  INTO REC;
              EXIT WHEN CLREF%NOTFOUND;

            dbms_output.put_line(REC.REC_STAT);    

              IF (REC.REC_STAT = 'UPDT')   
              THEN

                  L_UPD_COUNT := L_UPD_COUNT + 1;

              ELSIF (REC.REC_STAT = 'DUPL' ) -- DUPLICATE
              THEN

                    L_DUP_COUNT := L_DUP_COUNT + 1;

              ELSIF REC.REC_STAT = 'DEL' THEN-- DELETION

                      L_DEL_COUNT := L_DEL_COUNT +1;

              ELSIF REC.REC_STAT = 'DEL_IGNR' THEN  
                        SRC_ID := SRC_FILE_ID_SEQ.NEXTVAL;

              END IF;

        END LOOP;
END;

【问题讨论】:

  • 因为它正在打印 REC,我假设您的 CASE 语句中的以下条件在 S.DETL_CLMNS_HASH = S.DETL_CLMNS_HASH THEN ''REC'' 时得到满足,因此您的 DBMS_OUTPUT 正在打印 REC。此外,您还没有在 IF 语句中处理此条件 IF (REC.REC_STAT = 'REC')。

标签: oracle plsql


【解决方案1】:

正如 Avrajit 上面提到的,请修改代码,我也可以在 case 语句中的代码中看到: WHEN S.DETL_CLMNS_HASH = S.DETL_CLMNS_HASH THEN ''REC''

由于上述条件,您得到的输出为REC,此语句始终为真。

【讨论】:

    【解决方案2】:

    通过查看您的代码,我可以看到过程中缺少一些指针。只有当nullREC_STAT 字段为“空白”时,才会出现这种情况。

    首先打印动态 sql,然后尝试运行它并检查值。希望这些对您有所帮助。

    CREATE OR REPLACE PROCEDURE TEST_SP(
        Dy_File_Name  IN VARCHAR2,
        SUPPLIER_CD   IN VARCHAR2,
        EXT_PHARMA_ID IN OUT VARCHAR2,
        FLAG_VALUE    IN VARCHAR2)
    AS
      CLREF SYS_REFCURSOR;
    TYPE REC_TYP
    IS
      RECORD
      (
        AB         VARCHAR2(256) ,
        AB1        VARCHAR2(256) ,
        AB2        NUMBER(20),
        REC_STAT   VARCHAR2(9),
        VER_DOSAGE VARCHAR2(20)
        );
    REC REC_TYP; --Was missing
    BEGIN        -- was missing
        OPEN CLREF FOR 
        'SELECT                  
            S.ABC AS AB,              
            S.ABC1 AS AB1,              
            S.ABC2 AS AB2,                  
            S.VERBOSE_DOSAGE                AS VER_DOSAGE,                  
            CASE WHEN S.DEL_IND = 1 AND H.DEL_IND = 0 THEN ''DEL''                       
            WHEN S.DEL_IND = 1 AND H.DEL_IND IS NULL THEN ''DEL_IGNR''                       
            WHEN S.DETL_CLMNS_HASH <> H.DETL_CLMNS_HASH THEN ''UPDT''                       
            WHEN S.DETL_CLMNS_HASH = H.DETL_CLMNS_HASH THEN ''DUPL''                       
            WHEN S.DETL_CLMNS_HASH = S.DETL_CLMNS_HASH THEN ''REC''                       
            WHEN H.DETL_CLMNS_HASH IS NULL THEN ''NEW''                       
            ELSE ''ERR'' END AS REC_STAT                
    
            FROM                  
            (SELECT stg.*,                    
            row_number() over ( partition BY key_clmns_hash, rx_dspnsd_dt, del_ind ORDER BY 1) AS RN                  
            FROM  ' || Dy_File_Name ||
            '   stg                  
            ) s                
            LEFT JOIN ps_pharmacy p ON s.extrnl_pharmacy_id = p.extrnl_pharmacy_id                  
            LEFT JOIN ps_rx_hist H                
            ON h.key_clmns_hash        = s.key_clmnS_hash                
            AND h.rx_dspnsd_dt         = s.rx_dspnsd_dt                
            AND s.supplier_pharmacy_cd = h.SUPPLIER_PHARMACY_CD                
            WHERE s.RN                 = 1';
        LOOP
          FETCH CLREF INTO REC;
          EXIT WHEN CLREF%NOTFOUND;
          dbms_output.put_line(REC.REC_STAT); --Try to print any other entity returned by the dynamic sql
          IF (REC.REC_STAT    = 'UPDT') THEN
            L_UPD_COUNT      := L_UPD_COUNT + 1;
          ELSIF (REC.REC_STAT = 'DUPL' ) -- DUPLICATE
            THEN
            L_DUP_COUNT     := L_DUP_COUNT + 1;
          ELSIF REC.REC_STAT = 'DEL' THEN-- DELETION
            L_DEL_COUNT     := L_DEL_COUNT +1;
          ELSIF REC.REC_STAT = 'DEL_IGNR' THEN
            SRC_ID          := SRC_FILE_ID_SEQ.NEXTVAL;
          END IF;
        END LOOP;
      END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-13
      • 2021-04-06
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多