我怎样才能获得PL/SQL块来输出SELECT
语句的结果,就像我做一个普通的一样SELECT
?
例如,如何做一个SELECT
像:
SELECT foo, bar FROM foobar;
提示:
BEGIN SELECT foo, bar FROM foobar; END;
不起作用.
这取决于你需要的结果.
如果您确定只有一行,请使用隐式游标:
DECLARE v_foo foobar.foo%TYPE; v_bar foobar.bar%TYPE; BEGIN SELECT foo,bar FROM foobar INTO v_foo, v_bar; -- Print the foo and bar values dbms_output.put_line('foo=' || v_foo || ', bar=' || v_bar); EXCEPTION WHEN NO_DATA_FOUND THEN -- No rows selected, insert your exception handler here WHEN TOO_MANY_ROWS THEN -- More than 1 row seleced, insert your exception handler here END;
如果你想选择多于1行,你可以使用显式游标:
DECLARE CURSOR cur_foobar IS SELECT foo, bar FROM foobar; v_foo foobar.foo%TYPE; v_bar foobar.bar%TYPE; BEGIN -- Open the cursor and loop through the records OPEN cur_foobar; LOOP FETCH cur_foobar INTO v_foo, v_bar; EXIT WHEN cur_foobar%NOTFOUND; -- Print the foo and bar values dbms_output.put_line('foo=' || v_foo || ', bar=' || v_bar); END LOOP; CLOSE cur_foobar; END;
或使用其他类型的游标:
BEGIN -- Open the cursor and loop through the records FOR v_rec IN (SELECT foo, bar FROM foobar) LOOP -- Print the foo and bar values dbms_output.put_line('foo=' || v_rec.foo || ', bar=' || v_rec.bar); END LOOP; END;
您可以在Oracle 12.1或更高版本中执行此操作:
declare rc sys_refcursor; begin open rc for select * from dual; dbms_sql.return_result(rc); end;
我没有12.x数据库或DBVisualizer来测试,但这应该是你的起点.
有关更多详细信息,请参阅Oracle 12.1新增功能指南,Tom Kyte的博客,Oracle Base等中的隐式结果集.
对于早期版本,根据工具,您可以使用ref游标绑定变量,如SQL*Plus中的此示例:
set autoprint on var rc refcursor begin open :rc for select count(*) from dual; end; / PL/SQL procedure successfully completed. COUNT(*) ---------- 1 1 row selected.
在包中创建一个函数并返回一个SYS_REFCURSOR:
FUNCTION Function1 return SYS_REFCURSOR IS l_cursor SYS_REFCURSOR; BEGIN open l_cursor for SELECT foo,bar FROM foobar; return l_cursor; END Function1;
从一个匿名的块?我现在想更多地了解您认为需要的情况,因为使用子查询因子子句和内联视图,除了最复杂的情况之外,您需要求助于PL/SQL.
如果可以使用命名过程,则使用流水线函数.以下是从文档中提取的示例:
CREATE PACKAGE pkg1 AS TYPE numset_t IS TABLE OF NUMBER; FUNCTION f1(x NUMBER) RETURN numset_t PIPELINED; END pkg1; / CREATE PACKAGE BODY pkg1 AS -- FUNCTION f1 returns a collection of elements (1,2,3,... x) FUNCTION f1(x NUMBER) RETURN numset_t PIPELINED IS BEGIN FOR i IN 1..x LOOP PIPE ROW(i); END LOOP; RETURN; END; END pkg1; / -- pipelined function is used in FROM clause of SELECT statement SELECT * FROM TABLE(pkg1.f1(5));