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;
任何帮助都可以。
答案 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条件匹配的所有行。
分享并享受。