如何在一个过程体中编写多个选择查询

时间:2013-08-25 10:21:49

标签: sql oracle plsql oracle11g

这是我的oracle 11g XE的pl / sql代码。我怎么能解决这个问题我想同时运行两个选择查询请帮助我....他们是作为单个程序工作。

CREATE OR REPLACE PACKAGE myproc
as
  PROCEDURE TestProc (p_recordset OUT SYS_REFCURSOR, lock_s OUT SYS_REFCURSOR);
END myproc;
/

CREATE OR REPLACE PACKAGE BODY myproc
IS
  PROCEDURE TestProc (p_recordset OUT SYS_REFCURSOR, lock_s OUT SYS_REFCURSOR)
  AS
  BEGIN
    OPEN p_recordset FOR
     select a.TABLESPACE_NAME as Tablespace,
            round((1-((a.BYTES-nvl(b.BYTES,0))/a.BYTES))*100,2) AS Percentages
       from (select TABLESPACE_NAME, sum(BYTES) BYTES
               from sys.dba_data_files
              group by TABLESPACE_NAME) a,
            (select TABLESPACE_NAME, sum(BYTES) BYTES
               from sys.dba_free_space
              group by TABLESPACE_NAME) b
      where a.TABLESPACE_NAME = b.TABLESPACE_NAME (+)
      order by ((a.BYTES-b.BYTES)/a.BYTES) desc;

     SELECT vh.sid locking_sid,
            vw.sid waiter_sid,
            vs.status status,
            vs.program program_holding,
            vsw.program program_waiting
       FROM v$lock vh, v$lock vw, v$session vs, v$session vsw
      WHERE (vh.id1, vh.id2) IN (SELECT id1, id2
                                   FROM v$lock
                                  WHERE request = 0
                                 INTERSECT
                                 SELECT id1, id2
                                   FROM v$lock WHERE lmode = 0)
        AND vh.id1 = vw.id1
        AND vh.id2 = vw.id2
        AND vh.request = 0
        AND vw.lmode = 0
        AND vh.sid = vs.sid
        AND vw.sid = vsw.sid;
  end;
end;
/

错误信息是: -

  

警告:使用编译错误创建了Package Body。

SQL> show error
Errors for PACKAGE BODY MYPROC:<br/>

LINE/COL ERROR
-------- -----------------------------------------------------------------
13/4     PLS-00428: an INTO clause is expected in this SELECT statement
SQL>

2 个答案:

答案 0 :(得分:1)

错误意味着您SELECT了一些数据,但没有对它做任何事情。我怀疑你想把这些数据放到你目前未使用的lock_s过程参数中。在这种情况下,您需要做的就是添加行

OPEN lock_s FOR

紧接在第二个查询之上。 (您已经使用p_recordset为第一个设置了这个,我不知道您为什么没有第二个。)

答案 1 :(得分:0)

如果过程中有SELECT语句,则需要对结果执行某些操作。

  • 如果您知道要提取一行,则可以SELECT INTO个或多个局部变量。
  • 如果您选择多行,则可以执行SELECT BULK COLLECT INTO您定义的集合或集合。
  • 您可以使用SELECT语句打开从存储过程返回的游标(作为SYS_REFCURSOR输出参数)或在程序中循环的游标。

顺便提一下,除非你需要向后兼容古老版本的Oracle,否则如果你使用dba_waiters视图而不是加入{{1},那么第二个查询将更加不言自明。两次。