在 plsql 块中编译游标时出错

Posted

技术标签:

【中文标题】在 plsql 块中编译游标时出错【英文标题】:Error while compiling cursor in plsql block 【发布时间】:2020-01-04 10:25:37 【问题描述】:

我有一张桌子作为员工。我是 oracle 的新手。我正在创建光标,但是在编译时出现错误:

DECLARE 
    CURSOR c_data IS 
    SELECT distinct dept_id 
      FROM offc.employee; 

    tmp_event offc.employee.dept_id%type; 

BEGIN 
    OPEN c_data; 

    LOOP 
        FETCH c_data INTO tmp_event; 
      EXIT WHEN c_data%NOTFOUND; 

        Dbms_Output.Put_Line(tmp_event.dept_id); 
    END LOOP; 

    CLOSE c_data; 
END;     
/ 

我得到如下错误:

第 1 行错误 ORA-06550: 第 15 行,第 40 列:PLS-00487: 无效 引用变量 'TMP_EVENT' ORA-06550: 第 15 行,第 9 列: PL/SQL:语句被忽略

我认为tmp_event声明有问题。如何处理这个错误?

【问题讨论】:

【参考方案1】:

你应该使用Dbms_Output.Put_Line(tmp_event);

其中tmp_event 是一个已经是offc.employee.dept_id%type 类型的变量

This link 将有助于了解详细信息。

【讨论】:

【参考方案2】:

试试下面的查询

DECLARE 
        CURSOR c_data IS 
          SELECT distinct dept_id 
          FROM   offc.employee; 
        tmp_event offc.employee.dept_id%type; 

    BEGIN 
        OPEN c_data; 

        LOOP 
            FETCH c_data INTO tmp_event; 

            EXIT WHEN c_data%NOTFOUND; 

            dbms_output.Put_line(tmp_event); --Dont Use Dept id
        END LOOP; 

        CLOSE c_data; 
    END; 

    / 

【讨论】:

【参考方案3】:

以下 PL/SQL 语句与原始语句等效,但更短,因此更不容易出现编程错误。

DECLARE
  CURSOR c_data IS
    SELECT DISTINCT dept_id 
      FROM offc.employee;

BEGIN
  FOR r_data IN c_data LOOP
    Dbms_Output.Put_Line(r_data.dept_id);
  END LOOP;
END;
/

【讨论】:

以上是关于在 plsql 块中编译游标时出错的主要内容,如果未能解决你的问题,请参考以下文章

plsql--游标用法

『ORACLE』 PLSQL动态游标的使用(11g)

PLSQL游标笔记一

如何在 PLSQL 中释放游标?

PLSQL - 游标不能在动态 sql 中使用

无法在 plsql 过程中找出循环游标