Gam*_*eak 59 sql oracle plsql oracle10g oracle-apex
我怎样才能获得PL/SQL块来输出SELECT
语句的结果,就像我做一个普通的一样SELECT
?
例如,如何做一个SELECT
像:
SELECT foo, bar FROM foobar;
Run Code Online (Sandbox Code Playgroud)
提示:
BEGIN
SELECT foo, bar FROM foobar;
END;
Run Code Online (Sandbox Code Playgroud)
不起作用.
Ser*_*nik 39
这取决于你需要的结果.
如果您确定只有一行,请使用隐式游标:
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;
Run Code Online (Sandbox Code Playgroud)
如果你想选择多于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;
Run Code Online (Sandbox Code Playgroud)
或使用其他类型的游标:
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;
Run Code Online (Sandbox Code Playgroud)
Wil*_*son 38
您可以在Oracle 12.1或更高版本中执行此操作:
declare
rc sys_refcursor;
begin
open rc for select * from dual;
dbms_sql.return_result(rc);
end;
Run Code Online (Sandbox Code Playgroud)
我没有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.
Run Code Online (Sandbox Code Playgroud)
在包中创建一个函数并返回一个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;
Run Code Online (Sandbox Code Playgroud)
从一个匿名的块?我现在想更多地了解您认为需要的情况,因为使用子查询因子子句和内联视图,除了最复杂的情况之外,您需要求助于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));
Run Code Online (Sandbox Code Playgroud)
小智 5
如果您想在 pl/sql 中查看选择查询输出,您需要使用显式游标。它将保存活动数据集,并通过一次获取每一行,只要它通过循环迭代从数据集中获取记录,它就会显示活动数据集中的所有记录。此数据不会以表格格式生成,此结果将以纯文本格式生成。希望这会有所帮助。对于任何其他查询,您可能会问......
set serveroutput on;
declare
cursor c1 is
select foo, bar from foobar;
begin
for i in c1 loop
dbms_output.put_line(i.foo || ' ' || i.bar);
end loop;
end;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
146695 次 |
最近记录: |