oracle中如何打印光标值?

Ran*_*guy 6 oracle plsql stored-procedures sys-refcursor oracle11g

我是 Oracle 新手,正在学习游标。我的表 City 有两列 city_id,city_name。所以,这就是我尝试过的:

DECLARE
  CURSOR city_list is
  SELECT * from OT.City;

  v_list SYS_REFCURSOR;
BEGIN
  OPEN city_list FOR
   v_list := city_list;
   DBMS_OUTPUT.PUT_LINE(v_list.city_id);
   EXIT WHEN city_list%NOTFOUND;
  CLOSE city_list;
END;
/
Run Code Online (Sandbox Code Playgroud)

我试图将游标的数据分配给新声明的值 v_list SYS_REFCURSOR;。但是输出出现错误v_list := city_list;。如何将游标的所有值直接分配给另一个游标,或者还有其他方法吗?

Bar*_*han 8

您仍然可以通过在和子句SYS_REFCURSOR之间定位来使用,然后是光标,然后OPENFOR

需要添加LOOP FETCH INTO... END LOOP模板并在当前代码后关闭打开的光标:

DECLARE
  v_list SYS_REFCURSOR;
  v_city_id   city.city_id%TYPE;
  v_city_name city.city_name%TYPE;
BEGIN 
  OPEN v_list FOR
    SELECT city_id, city_name FROM City;

  LOOP 
    FETCH v_list
    INTO  v_city_id, v_city_name;
    EXIT WHEN v_list%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(v_city_id || ' - ' || v_city_name);
  END LOOP;
  CLOSE v_list;  
END;
/
Run Code Online (Sandbox Code Playgroud)

Demo


Tej*_*ash 7

这个问题被标记为oracle 11g,但让我提供oracle 12c中引入的返回结果的新方法。

DBMS_SQL.RETURN_RESULT(l_cursor)可用于在oracle 12c中打印结果。

DECLARE
 v_list SYS_REFCURSOR
BEGIN
 Open v_list for
 SELECT * from OT.City;

 DBMS_SQL.RETURN_RESULT(v_list);
END;
/
Run Code Online (Sandbox Code Playgroud)

干杯!!