Sql 使用游标遍历表行

Sql 使用游标遍历表行,sql,oracle,plsql,Sql,Oracle,Plsql,我正在尝试使用光标循环遍历各行,并使用line\u id和line\u message列中的消息为每行打印Hello World消息,但我得到一个错误: Errors: PROCEDURE CURSOR_PROC Line/Col: 4/10 PLS-00103: Encountered the symbol "CUR" when expecting one of the following: := . ( @ % ; ORA-06550: line 1, colu

我正在尝试使用光标循环遍历各行,并使用
line\u id
line\u message
列中的消息为每行打印Hello World消息,但我得到一个错误:

Errors: PROCEDURE CURSOR_PROC
Line/Col: 4/10 PLS-00103: Encountered the symbol "CUR" when expecting one of the following:

   := . ( @ % ;

ORA-06550: line 1, column 7:
PLS-00905: object SQL_JRIJMVCLEKHINBWFZGYOVYVIR.CURSOR_PROC is invalid 
下面是我的代码示例:

CREATE OR REPLACE PROCEDURE CURSOR_PROC
IS
BEGIN
  cursor cur is select line_id, line_message from TABLE_T;
  open cur;
  for rec in cur LOOP
     dbms_output.put_line('Hello world! ' || line_id || ', ' || line_message);
  END LOOP;
END CURSOR_PROC;
/

EXEC CURSOR_PROC;

如何修复它?

将光标定义放在DECLARE块中,并作为输出的一部分完全限定记录:

CREATE OR REPLACE PROCEDURE CURSOR_PROC
IS
DECLARE
  cursor cur is select line_id, line_message from TABLE_T;
BEGIN
  for rec in cur LOOP
     dbms_output.put_line('Hello world! ' || rec.line_id || ', ' || rec.line_message);
  END LOOP;
END CURSOR_PROC;
/

EXEC CURSOR_PROC;
请看这里:


此外,在此上下文中不严格要求使用
OPEN CURSOR
,但如果这样做,则在完成时始终包含一个显式
CLOSE CURSOR

CURSOR cur是select line\u id,line\u message from TABLE\t是一个声明,所以在开始之前我已经移动了这一行Open cur,在循环中需要指定rec.line\u id而不是line\u id。现在它工作正常

CREATE OR REPLACE PROCEDURE CURSOR_PROC
IS
cursor cur is select line_id, line_message from TABLE_T;
BEGIN
  
  for rec in cur LOOP
     dbms_output.put_line('Hello world! ' || rec.line_id || ', ' || rec.line_message);
  END LOOP;
  
END CURSOR_PROC;

或者您可以完全取消声明游标

CREATE OR REPLACE PROCEDURE CURSOR_PROC
IS

BEGIN
  for rec in (select line_id, line_message from TABLE_T)
  LOOP
     dbms_output.put_line('Hello world! ' || rec.line_id || ', ' || rec.line_message);
  END LOOP;
END CURSOR_PROC;
/

已经修好了。请试试我的答案。