如何调整我的程序以绕过精确提取返回多个请求的数字

时间:2014-05-08 03:26:55

标签: oracle plsql plsqldeveloper

    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;

我的上述过程有一个IN参数,它取值为'P'。如果输入值为'P' 然后从表TEMP_L中将SELECT CUR_DATE和TGT_TAB分成两个独立的变量V_DATE和V_TAB,其中两列返回空值。对于返回true的记录然后应用此逻辑,如果变量V_TAB从TGT_TAB获取记录,='TEMP_V'(我意识到它可能返回多于1条记录而且不同的一条,这就是我要求帮助的原因)然后插入..插入..

现在问题是,我的SELECT INTO变量只能容纳1个值,有时可能会有多个记录在TGT_TAB中返回null并且值不同。有时它会是TEMP_V,有时会是TEMP_T等。

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

                   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;

任何帮助都可以。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

试试这个:

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;

这将使用游标循环替换原始代码中的单例SELECT,该游标循环允许处理与SELECT条件匹配的所有行。

分享并享受。