前言
你有没有遇到类似以下问题:
明明在存储过程中写了游标,却无法正常编译?
如以下示例存储过程:
CREATE OR REPLACE PROCEDURE DICT_PROGRAM AS
BEGIN
SAVEPOINT EACH_FILE;
CURSOR cur is
SELECT *
FROM ICT_STAT.FND_SYSTEM_PHASE T1, ICT_STAT.FND_SYSTEM_PHASE T3
WHERE T1.PARENT_PHASE_ID = T3.PHASE_ID
AND T1.ENABLE_FLAG = 'Y'
AND T1.PARENT_PHASE_ID != 'null';
EXCEPTION
WHEN OTHERS THEN
ROLLBACK TO EACH_FILE;
END;
说明:
以上存储过程的问题出在:
- 缺少变量声明:
声明了一个游标,但是没有使用游标:
没有游标的打开、提取和关闭; - 没有可执行的描述:
在BEGIN和EXCEPTION之间,应该有需要执行的逻辑动作,以上存储里面只有一个游标的描述; - 游标Cursor放错了位置:
游标声明应该放在声明部分,即AS和BEGIN之间,而不是在逻辑动作执行部分。
以下是正确的版本格式示例及其说明:
CREATE OR REPLACE PROCEDURE DICT_PROGRAM AS
-- Declaration section
CURSOR cur IS
SELECT *
FROM ICT_STAT.FND_SYSTEM_PHASE T1, ICT_STAT.FND_SYSTEM_PHASE T3
WHERE T1.PARENT_PHASE_ID = T3.PHASE_ID
AND T1.ENABLE_FLAG = 'Y'
AND T1.PARENT_PHASE_ID != 'null';
-- You would typically declare variables to hold fetched data here
BEGIN
SAVEPOINT EACH_FILE;
-- Executable section
-- Here you would typically:
-- 1. Open the cursor
-- 2. Fetch data in a loop
-- 3. Process the data
-- 4. Close the cursor
-- Example structure:
/*
OPEN cur;
LOOP
FETCH cur INTO variables;
EXIT WHEN cur%NOTFOUND;
-- Process data here
END LOOP;
CLOSE cur;
*/
EXCEPTION
WHEN OTHERS THEN
ROLLBACK TO EACH_FILE;
-- Consider adding error logging here
END;
总结
你需要确定过程应如何处理游标cursor中的数据,并在可执行部分实现相应的逻辑。