[英]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.