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;。如何将游标的所有值直接分配给另一个游标,或者还有其他方法吗?
您仍然可以通过在和子句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)
这个问题被标记为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)
干杯!!