0

这是我的 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;
/

错误信息是:-

警告:包体创建时出现编译错误。

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>
4

2 回答 2

1

该错误意味着您正在SELECT获取一些数据,但没有对其进行任何操作。我怀疑您想将此数据放入您lock_s目前未使用的过程参数中。在这种情况下,您需要做的就是添加该行

OPEN lock_s FOR

紧接在第二个查询之上。(你已经用p_recordset第一个解决了这个问题,我不确定你为什么没有第二个。)

于 2013-08-25T10:36:37.480 回答
0

如果你SELECT在一个过程中有一个语句,你需要对结果做一些事情。

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

顺便说一句,除非您需要向后兼容旧版本的 Oracle,否则如果您使用dba_waiters视图而不是连接v$lock两次,则第二个查询将更加不言自明。

于 2013-08-25T10:35:33.210 回答