繁体   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