Oracle存储过程定义了游标cursor却无法编译怎么办

前言

你有没有遇到类似以下问题:
明明在存储过程中写了游标,却无法正常编译?
如以下示例存储过程:

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中的数据,并在可执行部分实现相应的逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

encoding-console

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值