[英]how to write pl/sql procedure package body with more cursors and out them as varchar2
我是oracle pl / sql的新手。 我想编写代码以获取表空间信息和数据库锁定状态,并想将它们输出为varchar2。 我的代码给我错误
** PACKAGE BODY FINAL_PACKAGE错误:我以** SYS AS SYSDBA的身份运行
LINE/COL ERROR
11/13 PLS-00103: Encountered the symbol "SELECT" when expecting one of
the following:
( ; is return
第11行是
11 CURSOR汤匙选择a.TABLESPACE_NAME作为
代码是
CREATE OR REPLACE PACKAGE final_package as
PROCEDURE final_procedure(var1 in varchar2, dbinfo out varchar2);
END final_package;
/
CREATE OR REPLACE PACKAGE BODY final_package IS
PROCEDURE final_procedure(var1 in varchar2, dbinfo out varchar2) IS
BEGIN
IF var1 = 'a'
------ /* get tablespaces name, percentage */ ----
THEN
DECLARE
tsinfo varchar(500); ---- /* i want to put tablespaces result to this tsinfo */----
CURSOR tbsp 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;
BEGIN
FOR each_data in tbsp
LOOP
FETCH tbsp INTO tsinfo; --- /* i want to put tablespaces result to this tsinfo */ ---
END LOOP;
CLOSE tbsp;
---- /* get database lock status */ ----
ELSIF var1 = 'b' THEN
DECLARE lockinfo varchar(1500);
CURSOR lock_info 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;
BEGIN
FOR each_data in lockinfo
LOOP
FETCH lock_info INTO lockinfo; -- i want to put database lock result to this tsinfo
END LOOP;
CLOSE lock_info;
END IF;
END;
END;
/
改成
CURSOR tbsp选择a.TABLESPACE_NAME作为
通过编写方式,我假设您具有SQL Server背景。 我对您的代码进行了一些修复。 请记住,即使您在游标之间循环,您仍只会返回一个最新值。 要更改它,您必须使用集合,即:嵌套表,关联数组。 您的代码仍然无法使用,因为在光标中您选择了多列,然后尝试将其分配给包含单个值的变量。
尝试使用收藏集并发布答案。
编码:
CREATE OR REPLACE PACKAGE final_package IS
PROCEDURE final_procedure(var1 IN VARCHAR2, dbinfo OUT VARCHAR2);
END final_package;
CREATE OR REPLACE PACKAGE BODY final_package IS
PROCEDURE final_procedure(var1 IN VARCHAR2, dbinfo OUT VARCHAR2)
IS
-- declare variables
tsinfo varchar(500);
lockinfo varchar(1500);
-- declare cursors
CURSOR tbsp IS
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;
CURSOR lock_info IS
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;
BEGIN
IF var1 = 'a' THEN
-- open, loop and close
FOR each_data in tbsp
LOOP
FETCH tbsp INTO tsinfo;
END LOOP;
ELSIF var1 = 'b' THEN
-- open, loop and close
FOR each_data in lockinfo
LOOP
FETCH lock_info INTO lockinfo;
END LOOP;
END IF;
END final_procedure;
END final_package;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.