如何在oracle中打印光标值?

时间:2019-09-29 15:08:19

标签: oracle plsql 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;
/

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

4 个答案:

答案 0 :(得分:2)

您仍然可以使用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;
/

Demo

答案 1 :(得分:2)

您的代码有很多问题,例如:

  • v_list应该声明为city_list%ROWTYPE
  • 您需要先OPEN光标,然后LOOP
  • 要将当前记录分配给city_list,您要使用FETCH INTO

考虑此新版本的代码:

DECLARE
    CURSOR city_list IS SELECT * from city ORDER BY city_id;
    v_list city_list%ROWTYPE;
BEGIN
    OPEN city_list;
    LOOP
        FETCH city_list INTO v_list;
        EXIT when city_list%notfound;
        DBMS_OUTPUT.PUT_LINE(v_list.city_id);
    END LOOP;
    CLOSE city_list;

END;
/

this demo on DB Fiddle 中,为city表提供了以下内容:

CITY_ID | CITY_NAME  
------: | :----------
      1 | New York   
      2 | Los Angeles

代码输出:

1 rows affected

dbms_output:
1
2

答案 2 :(得分:2)

在11g中,从游标中打印值的最简单方法是传递游标变量:

var rc refcursor
begin
    open :rc for
    select City.* from (
        select rownum id, trim (column_value) name 
        from xmlTable ('"New York","Paris"')) City;
end;
/

        ID NAME            
---------- ----------------
         1 New York        
         2 Paris     

答案 3 :(得分:1)

这个问题用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;
/

干杯!