这是我的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>
答案 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},那么第二个查询将更加不言自明。两次。