Oracle 我如何调整我的过程以绕过确切的获取返回多个请求的数字

Oracle 我如何调整我的过程以绕过确切的获取返回多个请求的数字,oracle,plsql,plsqldeveloper,Oracle,Plsql,Plsqldeveloper,我上面的过程有一个IN参数,它接受诸如“p”之类的值。如果输入值为“P” 然后从表TEMP_L中选择CUR_DATE和TGT_TAB作为两个单独的变量V_DATE和V_TAB,其中两列返回空值。对于返回true的记录,然后应用此逻辑,如果变量V_TAB从TGT_TAB获取记录,='TEMP_V'我意识到它可能返回多个记录和不同的记录,这就是为什么我请求帮助然后插入。。否则插入 现在问题来了,我的SELECT INTO变量只能保存1个值,有时可能会有多个记录返回null,并且在TGT_选项卡中具有

我上面的过程有一个IN参数,它接受诸如“p”之类的值。如果输入值为“P” 然后从表TEMP_L中选择CUR_DATE和TGT_TAB作为两个单独的变量V_DATE和V_TAB,其中两列返回空值。对于返回true的记录,然后应用此逻辑,如果变量V_TAB从TGT_TAB获取记录,='TEMP_V'我意识到它可能返回多个记录和不同的记录,这就是为什么我请求帮助然后插入。。否则插入

现在问题来了,我的SELECT INTO变量只能保存1个值,有时可能会有多个记录返回null,并且在TGT_选项卡中具有不同的值。有时是临时的,有时是临时的等等

如何更改脚本以成功运行脚本的底部? 由于将返回多个记录,我的变量将返回错误:exact fetch返回多个请求的数字。我尝试使用批量收集,但收集只在循环中工作,我不确定如何将其应用于我的以下要求。我需要根据返回值插入它们,'TEMP_V','TEMP_T',基本上如此

    CREATE OR REPLACE PROCEDURE SP_PROC (
       V_P      IN VARCHAR2 DEFAULT NULL)
    AS   
       V_DATE TIMESTAMP:=SYSDATE;
       V_TAB       VARCHAR2(10);
    BEGIN
       IF V_P = 'P' THEN

            SELECT CUR_DATE, TGT_TAB
                   INTO V_DATE, V_TAB
            FROM TEMP_L
                WHERE P='P'
                AND END_TIME IS NULL 
                AND COMPLETE_IND IS NULL;

            EXECUTE IMMEDIATE 'TRUNCATE TABLE '||V_TAB;

                IF V_TAB = 'TEMP_V' THEN
                    INSERT INTO TEMP_V
                    SELECT V FROM REP_TAB
                ELSE
                    EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_V';
                    INSERT INTO TEMP_V
                    SELECT V FROM REP_TAB
                END IF;

                 IF V_TAB = 'TEMP_T' THEN
                    INSERT INTO TEMP_V
                    SELECT V FROM REP_TAB
                 ELSE
                    EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_T';
                    INSERT INTO TEMP_V
                    SELECT V FROM REP_TAB
                 END IF;
    END;

任何帮助都可以。

您必须决定如何处理在select中返回多行的情况。是否要处理所有行?最后一排?第一排?一旦做出决定,您可以使用FOR循环或OPEN…FETCH…CLOSE循环来处理TEMP_L中的相应行。

尝试以下操作:

                   IF V_TAB = 'TEMP_V' THEN
                        INSERT INTO TEMP_V
                        SELECT V FROM REP_TAB
                    ELSE
                        EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_V';
                        INSERT INTO TEMP_V
                        SELECT V FROM REP_TAB
                    END IF;

                    IF V_TAB = 'TEMP_T' THEN
                        INSERT INTO TEMP_V
                        SELECT V FROM REP_TAB
                    ELSE
                        EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_T';
                        INSERT INTO TEMP_V
                        SELECT V FROM REP_TAB
                    END IF;
这将使用光标循环替换原始代码中的单例选择,该循环允许处理与选择条件匹配的所有行


分享和享受。

我将使用最早的当前日期。它将是如下所示。选择当前日期,TGT\U选项卡进入V\U日期,V_TAB FROM TEMP_L,其中P='P'和END_TIME为NULL,COMPLETE_IND为NULL,START_TIME=选择MINCUR_DATE FROM TEMP_L,其中END_TIME为NULL,COMPLETE_IND为NULL和PARA='P';你能给我举个例子吗?
CREATE OR REPLACE PROCEDURE SP_PROC (
  V_P      IN VARCHAR2 DEFAULT NULL)
AS   
BEGIN
  IF V_P = 'P' THEN
    FOR aRow IN (SELECT CUR_DATE, TGT_TAB
                   FROM TEMP_L
                   WHERE P='P'
                     AND END_TIME IS NULL 
                     AND COMPLETE_IND IS NULL)
    LOOP
      EXECUTE IMMEDIATE 'TRUNCATE TABLE '|| aRow.TGT_TAB;

      IF aRow.TGT_TAB = 'TEMP_V' THEN
        INSERT INTO TEMP_V
          SELECT V FROM REP_TAB;
      ELSE
        EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_V';

        INSERT INTO TEMP_V
          SELECT V FROM REP_TAB;
      END IF;

      IF aRow.TGT_TAB = 'TEMP_T' THEN
        INSERT INTO TEMP_V
          SELECT V FROM REP_TAB;
      ELSE
        EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_T';

        INSERT INTO TEMP_V
          SELECT V FROM REP_TAB;
      END IF;
    END LOOP;
  END IF;
END SP_PROC;