我在创建此存储过程时遇到问题,执行时遇到一些错误。错误包括忽略的SQL语句和未正确结束的SQL命令。我认为所有代码都非常干净。
请协助。
CREATE OR REPLACE PROCEDURE sp_INSERT
(RECORD_COUNT OUT NUMBER)
IS
BEGIN
SELECT COUNT(*)
INTO RECORD_COUNT
FROM TABLE1;
IF RECORD_COUNT > 0 THEN
EXECUTE IMMEDIATE 'TRUNCATE TABLE TABLE1'
END IF;
IF RECORD_COUNT = 0 THEN
INSERT INTO TABLE1
(
JOB_ID,
NUM_SP1,
NUM_SP2,
NUM_SP3,
NUM_SP4,
)
(SELECT JOB_ID,
NUM_SP1,
NUM_SP2,
NUM_SP3,
NUM_SP4,
FROM EXTERNAL_TABLE)
COMMIT;
END IF;
END;
最佳答案
第一个:您在过程中的任何指令末尾都需要;
。
第二个:TRUNCATE
是DDL命令,DDL命令在plsql中无效,您可以直接使用DELETE
命令或使用EXECUTE IMMEDIATE Statement:
第三次:有关insert-select statement
的信息,请参见here和here。
CREATE OR REPLACE PROCEDURE sp_INSERT
(RECORD_COUNT OUT NUMBER)
IS
BEGIN
SELECT NVL(COUNT(*),0)
INTO RECORD_COUNT
FROM TABLE1;
IF RECORD_COUNT > 0 THEN
EXECUTE IMMEDIATE 'TRUNCATE TABLE TABLE1';
END IF;
-- or
IF RECORD_COUNT > 0 THEN
DELETE TABLE1;
END IF;
IF RECORD_COUNT = 0 THEN
INSERT INTO TABLE1
(
JOB_ID,
NUM_SP1,
NUM_SP2,
NUM_SP3,
NUM_SP4
)
SELECT JOB_ID,
NUM_SP1,
NUM_SP2,
NUM_SP3,
NUM_SP4
FROM EXTERNAL_TABLE;
COMMIT;
END IF;
END;
/*
VAR N NUMBER;
EXCE SP_INSERT(:N);
PRINT N;
N
----------
0
INSERT INTO TABLE1 VALUES(1,1,1,1,1);
INSERT INTO TABLE1 VALUES(1,1,1,1,1);
INSERT INTO TABLE1 VALUES(1,1,1,1,1);
COMMIT;
VAR N NUMBER;
EXCE SP_INSERT(:N);
PRINT N;
N
-------
3
*/
关于stored-procedures - 使用IF和THEN在Oracle 11g pl/sql中创建存储过程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19122048/