簡體   English   中英

如何編寫具有更多游標的pl / sql過程包主體並將其作為varchar2輸出

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM