如何使用 %ROWTYPE 获取游标值

Posted

技术标签:

【中文标题】如何使用 %ROWTYPE 获取游标值【英文标题】:How to fetch cursor value with %ROWTYPE 【发布时间】:2016-02-01 09:38:46 【问题描述】:

我做了一个如下所示的过程我想获取光标值并从其他循环中提取这些值告诉我最好的方法是我的代码

 CREATE OR REPLACE PROCEDURE TEST (P_EMP_ID     NUMBER,
                                                  TRIGER_BY    VARCHAR2)
AS
   CURSOR TO_HOD
   IS
      SELECT   EMP.EMPLOYEE_CODE,
               EMP.EMP_NAME,
               APR.LEFT_DT,
               APR.RESIGN_TYPE
        FROM   FSC_APPROVAL APR, CHR_ALL_EMPLOYEE_BI_V EMP
       WHERE       APR.HOD_APPR = 'Y'
               AND APR.ZONE_HD_APPR IS NULL
               AND EMP.EMPLOYEE_ID = APR.EMP_ID;

   CURSOR TO_ZONE
   IS
      SELECT   EMP.EMPLOYEE_CODE,
               EMP.EMP_NAME,
               APR.LEFT_DT,
               APR.RESIGN_TYPE
        FROM   FSC_APPROVAL APR, CHR_ALL_EMPLOYEE_BI_V EMP
       WHERE       APR.HOD_APPR = 'Y'
               AND APR.ZONE_HD_APPR = 'Y'
               AND APR.TIM_OFC_APPR IS NULL
               AND EMP.EMPLOYEE_ID = APR.EMP_ID;

   CUR_VAL            TO_HOD%ROWTYPE;
   CUR_VAL_FOR_LOOP   TO_HOD%ROWTYPE;

程序从这里开始

    BEGIN

       IF TRIGER_BY = 'HOD'
       THEN
          OPEN TO_HOD;

          LOOP
             FETCH TO_HOD INTO   CUR_VAL;

             EXIT WHEN TO_HOD%NOTFOUND;
          END LOOP;
       ELSIF TRIGER_BY = 'ZONE'
       THEN
          OPEN TO_ZONE;

          LOOP
             FETCH TO_ZONE INTO   CUR_VAL;

             EXIT WHEN TO_ZONE%NOTFOUND;
          END LOOP;

   END IF;

在上面的代码中,只需获取我的数据并放入 cur_val 即 %rowtype 之后我在新循环中获取这些值,但它没有意义并显示错误 PLS-00456: item 'CUR_VAL' is not a cursor

LOOP
      ***FETCH CUR_VAL INTO   CUR_VAL_FOR_LOOP;***

      DBMS_OUTPUT.PUT_LINE (CUR_VAL_FOR_LOOP.EMPLOYEE_CODE);
   END LOOP;
END;
/

我在这条线上遇到错误FETCH CUR_VAL INTO CUR_VAL_FOR_LOOP; 如果您有更好的选择,请指导我如何按照我的意愿进行此程序,如果您对我的问题有进一步的疑问,我将热烈欢迎,然后我将在这里为您描述

【问题讨论】:

我只想创建一个变量,如果我只有 TO_HOD%TYPE 它显示它是用于 TO_HOD CURSOR 并且如果我声明 TO_ZONE%TYPE 它只用于 TO_ZONE CURSOR 我希望我只有一个变量因为只有一个游标是从这些中运行的,并且我在循环中传递了那个变量 CUR_VAL 不是游标,您无法从中获取,它不包含查询的定义。 是的,它不是游标,它的 %rowtype 变量我在变量中获取游标 不,在您的循环中,您试图从一个变量 (CUR_VAL) 获取另一个变量 (CUR_VAL_FOR_LOOP)...因此 CUR_VAL 不是游标。 【参考方案1】:

为什么要使用两个变量?你可以做得更短(未经测试):

CURSOR TO_ALL(hd APR.ZONE_HD_APPR%TYPE) IS
  SELECT   EMP.EMPLOYEE_CODE,
           EMP.EMP_NAME,
           APR.LEFT_DT,
           APR.RESIGN_TYPE
    FROM   FSC_APPROVAL APR, 
              JOIN CHR_ALL_EMPLOYEE_BI_V EMP ON EMP.EMPLOYEE_ID = APR.EMP_ID
   WHERE   APR.HOD_APPR = 'Y'
           AND NVL(APR.ZONE_HD_APPR, 'NULL') = NVL(hd, 'NULL')
           AND EMP.EMPLOYEE_ID = APR.EMP_ID;

CUR_VAL TO_ALL%ROWTYPE;

BEGIN

      OPEN TO_ALL(CASE TRIGER_BY WHEN 'HOD' THEN 'NULL' ELSE 'Y');
      LOOP
         FETCH TO_ALL INTO   CUR_VAL;
         ...
         EXIT WHEN TO_ALL%NOTFOUND;
      END LOOP;

END;

【讨论】:

以上是关于如何使用 %ROWTYPE 获取游标值的主要内容,如果未能解决你的问题,请参考以下文章

如何在动态SQL(SQL Server)中的Select语句中使用游标值

如何获取ListView的项目onItemClick的游标值?

如何添加两个游标值并更新表

如何在过程中的表中插入游标值

基于游标的记录与强引用游标

基于游标的记录与强引用游标