我是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;
出现错误。如何将游标的所有值分配给另一个游标直接还是还有其他方法?
答案 0 :(得分:2)
您仍然可以使用SYS_REFCURSOR
,方法是在OPEN
和FOR
子句之间定位,然后在光标之后定位
需要添加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;
/
答案 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;
/
干杯!