Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何停止使用%type和游标重复行_Oracle_Plsql - Fatal编程技术网

Oracle 如何停止使用%type和游标重复行

Oracle 如何停止使用%type和游标重复行,oracle,plsql,Oracle,Plsql,我做了一个如下所示的过程,我想获取游标值,提取变量中的这些值,并在新循环中提取这些变量,但问题是相同的行会重复 CREATE OR REPLACE PROCEDURE FSC.TEST (TRIGER_BY VARCHAR2) AS CURSOR TO_HOD IS SELECT EMP.EMPLOYEE_CODE, EMP.EMP_NAME --APR.LEFT_DT, -

我做了一个如下所示的过程,我想获取游标值,提取变量中的这些值,并在新循环中提取这些变量,但问题是相同的行会重复

CREATE OR REPLACE PROCEDURE FSC.TEST (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;
   emp_code CHR_ALL_EMPLOYEE_BI_V.EMPLOYEE_CODE%type;
   emp_name CHR_ALL_EMPLOYEE_BI_V.EMP_NAME%type;


BEGIN

   IF TRIGER_BY = 'HOD'
   THEN
      OPEN TO_HOD;

      LOOP
         FETCH TO_HOD INTO emp_code,emp_name;

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

      LOOP
         FETCH TO_ZONE INTO emp_code,emp_name;

         EXIT WHEN TO_ZONE%NOTFOUND;
         counter:=TO_ZONE%ROWCOUNT;
      END LOOP;
   END IF;
在这里,我提取了存储在上述代码中的循环中的数据

这个循环提取数据

for i in 1..counter  loop

         DBMS_OUTPUT.PUT_LINE (emp_code||' '||emp_name);
         --EXIT WHEN CUR_VAL is null;
      end loop;
    END;
    /

但同一行重复

emp\u代码
emp\u名称
是标量。也就是说,它们只存储一个值。每次向它们中提取数据时,都会覆盖先前的值。如果您试图在最后打印数据,
emp_code
emp_name
将只包含最后获取的值,您将重复多次

为什么首先要使用显式游标(顺便说一句,您没有关闭它)?我猜,如果您是PL/SQL新手,那么最好使用隐式游标

   IF TRIGER_BY = 'HOD'
   THEN
     for rec in to_hod
     loop
       dbms_output.put_line( rec.employee_code || ' ' || rec.emp_name );
     end loop;
   ELSIF triger_by = 'ZONE'
   THEN
     for rec in to_zone
     loop
       dbms_output.put_line( rec.employee_code || ' ' || rec.emp_name );
     end loop;
   END IF;   

现在,您可以使用隐式游标,声明本地集合类型而不是本地标量变量,从游标向该集合类型执行
批量收集
,然后在后续步骤中迭代该集合。但我猜这超出了您真正想要做的。

您可以尝试在查询中使用
选择DISTINCT…
您在这里提出了几乎相同的问题:。你想解决的实际问题是什么?目前,您的代码(如编写的)没有任何用处。实际上,我想制作一个恶意程序,您知道它在body标记中有大量数据,所以我不想为每个if-else条件创建新的body标记。这是我希望使用%type或%rowtype变量并在新循环中提取此变量的方式抱歉,我没有遵循。您的意思是希望通过
批量采集
将数据提取到本地采集中吗?在这种情况下,局部变量需要是集合而不是标量,并且您实际上希望定义自己的记录或对象类型以及这些记录或对象的集合(分别作为一级对象或局部类型)。但是,如果要获取大量数据,将所有内容存储在本地集合中可能会让DBA感到不安。无论哪种情况,都不会使用锚定类型。