当前位置:  开发笔记 > 数据库 > 正文

是否可以从PL/SQL块输出SELECT语句?

如何解决《是否可以从PL/SQL块输出SELECT语句?》经验,为你挑选了4个好方法。

我怎样才能获得PL/SQL块来输出SELECT语句的结果,就像我做一个普通的一样SELECT

例如,如何做一个SELECT像:

SELECT foo, bar FROM foobar;

提示:

BEGIN
SELECT foo, bar FROM foobar;
END;

不起作用.



1> Sergey Stadn..:

这取决于你需要的结果.

如果您确定只有一行,请使用隐式游标:

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;


此外,如果您使用SQLPlus运行此操作,则需要SET SERVEROUTPUT ON才能查看输出.其他客户端可能具有需要启用的类似选项.

2> William Robe..:

您可以在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.



3> Igor Zelaya..:

在包中创建一个函数并返回一个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;



4> David Aldrid..:

从一个匿名的块?我现在想更多地了解您认为需要的情况,因为使用子查询因子子句和内联视图,除了最复杂的情​​况之外,您需要求助于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));


从Oracle的角度来看,你是100%正确的.然而,与Oracle一起度过我的前5年并在接下来的5年中使用SQL Server让我觉得如果Oracle允许这样的事情,那么生活会更容易[虽然不能以编程方式正确].:)
推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有