⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plgobj.spb

📁 Oracle PL/SQL procedure generator (second generator type)
💻 SPB
字号:
CREATE OR REPLACE PACKAGE BODY PLGobj
IS
/*----------------------------------------------------------------
||                  PL/Vision Professional 
||----------------------------------------------------------------
||    File: PLGobj.spb
||  Author: Steven Feuerstein
||
|| This is a part of the PL/Vision Professional Code library.
|| Copyright (C) 1996-99 RevealNet, Inc.
|| All rights reserved.
||
|| For more information, call RevealNet at 1-800-REVEAL4
|| or check out our Web page: www.revealnet.com
||
-----------------------------------------------------------------*/
   c_pkg CONSTANT PLGadmin.identifier := 'PLGobj';

   /* Standard trc and log flags */
   v_trc BOOLEAN := FALSE;
   v_log BOOLEAN := FALSE;

   /* Constants and variables for "Include code?" */
   c_include CONSTANT CHAR(1) := 'Y';
   c_noinclude CONSTANT CHAR(1) := 'N';
   v_inclall BOOLEAN := FALSE;
   v_sql_inclall CHAR(1) := c_noinclude;

   CURSOR obj_cur (nm VARCHAR2, tp VARCHAR2, sch VARCHAR2) 
   IS
      SELECT *
        FROM /* sys.dba_ */ ALL_OBJECTS
       WHERE object_name LIKE nm
         AND object_type LIKE tp
         AND owner LIKE sch
         AND (v_sql_inclall = c_include OR 
              object_type IN
                ('PACKAGE', 'PACKAGE BODY', 'PROCEDURE',
                 'FUNCTION', 'TRIGGER')) 
       ORDER BY owner,
          DECODE (object_type, 
             'PACKAGE', 1, 
             'PACKAGE BODY', 2,
             'PROCEDURE', 3,
             'FUNCTION', 4,
             'TRIGGER', 5, 
             6),
          object_name;

   /*--------------- Private Modules -----------------*/

   FUNCTION cased (name_in IN VARCHAR2) RETURN VARCHAR2
   IS
   BEGIN
      RETURN UPPER (name_in);
   END;

   PROCEDURE tokenize 
      (name1_inout IN OUT VARCHAR2,
       name2_out OUT VARCHAR2,
       char_in IN VARCHAR2 := '.')
   IS
      col_loc INTEGER;
   BEGIN
      col_loc := INSTR (name1_inout, char_in);
      IF col_loc = 1
      THEN
         name2_out := NULL;
         name1_inout := SUBSTR (name1_inout, 2);

      ELSIF col_loc > 1
      THEN
         name2_out := 
            UPPER (SUBSTR (name1_inout, 1, col_loc-1));
         name1_inout := 
            UPPER (SUBSTR (name1_inout, col_loc+1));
      ELSE
         name2_out := NULL;
      END IF;
   END;

   PROCEDURE convert_type (type_inout IN OUT VARCHAR2) IS
   BEGIN
      type_inout := UPPER (type_inout);

      IF type_inout IN (c_pkg_spec, c_package, 'PS', 'SPEC', 'SPECIFICATION')
       THEN type_inout := c_package;
      ELSIF type_inout IN (c_pkg_body, 'BODY', 'PB', c_package_body)
       THEN type_inout := c_package_body;
      ELSIF type_inout = c_entire_pkg THEN type_inout := 'PACKAGE%';
      ELSIF type_inout IN (c_clu, c_cluster) THEN type_inout := c_cluster;
      ELSIF type_inout IN (c_func, c_function, 'FUNC') THEN type_inout := c_function;
      ELSIF type_inout IN (c_ind, c_index) THEN type_inout := c_index;
      ELSIF type_inout IN (c_proc, c_procedure, 'PROC') THEN type_inout := c_procedure;
      ELSIF type_inout IN (c_seq, c_sequence) THEN type_inout := c_sequence;
      ELSIF type_inout IN (c_syn, c_synonym) THEN type_inout := c_synonym;
      ELSIF type_inout IN (c_tab, c_table) THEN type_inout := c_table;
      ELSIF type_inout IN (c_trig, c_trigger, 'TRIG') THEN type_inout := c_trigger;
      ELSIF type_inout IN (c_vu, c_view) THEN type_inout := c_view;

      ELSIF type_inout IN ('ALL', '%') OR type_inout IS NULL THEN type_inout := '%';
      
      ELSE
         type_inout := NULL;
      END IF;
   END;

   FUNCTION convtype (type_in IN VARCHAR2) RETURN VARCHAR2
   IS   
      retval PLGadmin.identifier := type_in;
   BEGIN
      convert_type (retval);
      RETURN retval;
   END;

   FUNCTION objfromnum (num_in IN INTEGER) RETURN VARCHAR2
   IS
      retval PLGadmin.identifier;
   BEGIN
      If num_in = 5 
      THEN 
         retval := c_synonym;

      ELSIF num_in = 7 
      THEN
         retval := c_procedure;

      ELSIF num_in = 8 
      THEN
         retval := c_function;

      ELSIF num_in = 9 
      THEN
         retval := c_package;

      ELSIF num_in = 11 
      THEN
         retval := c_package_body;

      ELSIF num_in = 12 
      THEN
         retval := c_trigger;

      END IF;
      RETURN retval;
   END;

   FUNCTION convcase (nm IN VARCHAR2) RETURN VARCHAR2
   IS   /* 99.2.8 Just return the name */
   BEGIN
      RETURN nm;
      /*
      -- If double quotes, then do not upper-case. 
      IF SUBSTR (nm, 1, 1) != '"'      
      THEN
         RETURN UPPER (nm);
      ELSE
        RETURN LTRIM (RTRIM (nm, '"'));
      END IF;
      */
   END;
         
/*--------------- Public Modules -----------------*/

/* Include Code Toggle */

   PROCEDURE inclall
   IS
   BEGIN
      v_inclall := TRUE;
      v_sql_inclall := c_include;
   END inclall;

   PROCEDURE noinclall
   IS
   BEGIN
      v_inclall := FALSE;
      v_sql_inclall := c_noinclude;
   END noinclall;

   FUNCTION including_all RETURN BOOLEAN
   IS
      retval BOOLEAN := v_inclall;
   BEGIN
      RETURN retval;
   END including_all;

   FUNCTION iscode (type_in IN VARCHAR2) RETURN BOOLEAN
   IS
      retval BOOLEAN := FALSE;
   BEGIN
      RETURN (type_in IN 
         (c_package, c_package_body, c_procedure, c_function));
   END iscode;

   PROCEDURE convert
      (name_inout IN OUT VARCHAR2, 
       type_inout IN OUT VARCHAR2,
       schema_inout IN OUT VARCHAR2)
   IS
      v_name PLGadmin.identifier := name_inout;
      col_loc INTEGER;
      v_schema PLGadmin.identifier;
      v_name2 PLGadmin.identifier;
      v_dblink PLGadmin.identifier;
      v_type NUMBER;
      objnum NUMBER;
   BEGIN
      IF v_name IS NULL
      THEN
         RAISE no_name_specified;
      END IF;

      IF type_inout IS NULL
      THEN
         tokenize (v_name, type_inout, ':');
      END IF;

      IF INSTR (v_name, '%') > 0 OR
         INSTR (v_name, '.') > 0 
      THEN
         name_inout := v_name;
         tokenize (name_inout, schema_inout);
         IF schema_inout IS NULL
         THEN
            schema_inout := USER;
         END IF;

         IF INSTR (type_inout, '%') = 0
         THEN
            convert_type (type_inout);

         ELSIF type_inout IS NULL /* 10/98 */
         THEN
            convert (name_inout, type_inout, schema_inout);
         END IF; 
      ELSE
         BEGIN
            DBMS_UTILITY.NAME_RESOLVE
               (cased (v_name), 1, 
                v_schema,
                v_name,
                v_name2,
                v_dblink,
                v_type,
                objnum);

         EXCEPTION
            WHEN OTHERS
            THEN     
               objnum := NULL;
         END;

         IF objnum IS NULL
         THEN
            /* No object found */
            schema_inout := NULL;
            name_inout := NULL;
            type_inout := NULL;
         ELSE
            schema_inout := v_schema;
            name_inout := NVL (v_name, v_name2);

            IF INSTR (type_inout, '%') > 0
            THEN
               NULL;
            ELSIF v_type = 9 AND type_inout IS NOT NULL
            THEN
               /* Package, so user may have specified
                  either specification or body. 
               */
               convert_type (type_inout);
            ELSE 
               type_inout := objfromnum (v_type);
            END IF;
         END IF;
      END IF;
   END convert;

   FUNCTION convspec (spec IN VARCHAR2, resolve_synonym IN BOOLEAN := FALSE) 
      RETURN spec_type
   /* Format of spec is T:O.N where T is the type and is optional (only
      really needed for package spec/body ambiguity, O is owner and
      optional with the default being USER and N is the name. All of
      these can also be wildcarded. */
   IS
      v_typeloc INTEGER := INSTR (spec, ':');
      v_dotloc INTEGER := INSTR (spec, '.');
      retval spec_type;
      
      CURSOR obj_cur (nm VARCHAR2, tp VARCHAR2, sch VARCHAR2) 
      IS
         SELECT object_name, object_type, owner
           FROM /* sys.dba_ */ ALL_OBJECTS
          WHERE (object_name LIKE nm OR object_name LIKE UPPER (nm))
            AND object_type LIKE tp
            AND owner LIKE sch
            AND OWNER != 'PUBLIC'
          ORDER BY owner, object_name;
      obj_rec obj_cur%ROWTYPE;
   BEGIN
      IF v_typeloc > 0
      THEN
         retval.type := SUBSTR (spec, 1, v_typeloc-1);
         PLGobj.convert_type (retval.type);
      END IF;

      IF v_dotloc > 0
      THEN
         retval.owner := UPPER (PLGstr.betwn (spec, v_typeloc+1, v_dotloc-1));
         retval.name := convcase (SUBSTR (spec, v_dotloc+1));
      ELSE
         retval.name := convcase (SUBSTR (spec, v_typeloc+1));
         
         /* First assume current USER, then wildcard if that fails. */
         OPEN obj_cur (retval.name, NVL (retval.type, '%'), USER);
         FETCH obj_cur INTO obj_rec; 
         IF obj_cur%NOTFOUND
         THEN
            CLOSE obj_cur;
            OPEN obj_cur (retval.name, NVL (retval.type, '%'), '%');
            FETCH obj_cur INTO obj_rec;
         END IF;
         CLOSE obj_cur;         
         retval.owner := NVL (obj_rec.owner, USER);
      END IF;

      /* If type is not set and there are no wildcards % in name and owner,
         look up the type. */
      IF retval.type IS NULL AND INSTR (retval.owner||retval.name, '%') = 0
      THEN
         OPEN obj_cur (retval.name, '%', retval.owner);
         FETCH obj_cur INTO obj_rec;
         CLOSE obj_cur;         
         retval.type := obj_rec.object_type;
      END IF;

      --PLGobj.convert_type (retval.type);

      /* 11/97 */
      IF resolve_synonym AND retval.type = c_synonym
      THEN
         DECLARE
            CURSOR syn_cur 
            IS
               SELECT table_owner, table_name FROM /* dba_ */ ALL_SYNONYMS
                WHERE owner = retval.owner
                  AND synonym_name = retval.name;
            syn_rec syn_cur%ROWTYPE;
         BEGIN
            OPEN syn_cur; 
            FETCH syn_cur INTO syn_rec;
            CLOSE syn_cur; 
            /*
            DBMS_OUTPUT.PUT_LINE ('synonym table owner ' || syn_rec.table_owner);
            DBMS_OUTPUT.PUT_LINE ('synonym table ' || syn_rec.table_name);
            */
            retval := convspec (syn_rec.table_owner || '.' || syn_rec.table_name);
            /*
            retval.owner := syn_rec.table_owner;
            retval.name := syn_rec.table_name;
            */
         END;
      END IF;

      RETURN retval;
   END;   

   FUNCTION lastobj 
      (status_in IN VARCHAR2 := '%', owner_in IN VARCHAR2 := USER) 
   RETURN /* sys.dba_ */ ALL_OBJECTS%ROWTYPE
   IS
       CURSOR last_cur
       IS
          SELECT *
            FROM /* sys.dba_ */ ALL_OBJECTS
           WHERE owner LIKE UPPER (owner_in)
             AND last_ddl_time =
              (SELECT MAX (last_ddl_time)
                 FROM /* sys.dba_ */ ALL_OBJECTS
                WHERE owner LIKE UPPER (owner_in)
                  AND status LIKE UPPER (status_in));  
       curr_rec /* sys.dba_ */ ALL_OBJECTS%ROWTYPE;  
   BEGIN
       OPEN last_cur;
       FETCH last_cur INTO curr_rec;
       RETURN curr_rec;
   END;

   FUNCTION last_modified (spec IN VARCHAR2, resolve_synonym IN BOOLEAN := FALSE)
   RETURN DATE
   IS
       CURSOR last_cur (o VARCHAR2, n VARCHAR2, t VARCHAR2)
       IS
          SELECT last_ddl_time
            FROM /* sys.dba_ */ ALL_OBJECTS
           WHERE owner = o
             AND object_name = n
             AND object_type = t;

       v_spec spec_type;
       retval DATE;
   BEGIN
      v_spec := convspec (spec, resolve_synonym);
      OPEN last_cur (v_spec.owner, v_spec.name, v_spec.type);
      FETCH last_cur INTO retval;
      CLOSE last_cur;
      RETURN retval;
   END;

   FUNCTION last_modified (
      sch IN VARCHAR2, tab IN VARCHAR2, resolve_synonym IN BOOLEAN := FALSE)
   RETURN DATE
   IS
   BEGIN
      RETURN last_modified (sch || '.' || tab, resolve_synonym);
   END;

   FUNCTION definer (spec IN VARCHAR2, resolve_synonym IN BOOLEAN := FALSE)
   RETURN VARCHAR2
   IS
       v_spec spec_type;
   BEGIN
   -- 05/2001: returns USER if object does not exist!
      v_spec := convspec (spec, resolve_synonym);
      RETURN v_spec.owner;
   END;

END PLGobj;
/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -