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

📄 plgval.w73

📁 Oracle PL/SQL procedure generator (second generator type)
💻 W73
字号:
CREATE OR REPLACE PACKAGE BODY PLGval
IS 

/*----------------------------------------------------------------
||                  PL/Generator from Quest Software 
||----------------------------------------------------------------
||    File: plgval.spb
||  Author: Steven Feuerstein 
||
|| This is a part of the PL/Generator Code library.
|| Copyright (C) 1997-1998 Quest Software, Inc.
|| All rights reserved.
||
|| For more information, call Quest Software at 1-800-REVEAL4
|| or check out our Web page: www.Quest Software.com
||
-----------------------------------------------------------------*/

/***************** Modification History **************************
|| Date     By     Description
|| -------- ------ -----------------------------------------------
|| 10/98    SEF    Add special exception handling for cursors
|| 2/98     SEF    Created 
******************************************************************/
   g_invalid_idents ident_tabtype;
   g_tabcol_conflicts tabcol_tabtype;

   CURSOR tab_cur (nm VARCHAR2, sch VARCHAR2) 
   IS
      SELECT object_name, owner
        FROM /* dba_ */ ALL_OBJECTS
       WHERE object_name LIKE UPPER (nm)
         AND object_type = 'TABLE'
         AND owner = UPPER (sch)
       ORDER BY owner, object_name;


/* Check identifiers for exceeding maximum length */

   FUNCTION invalid_idents (
      drv IN VARCHAR2, 
      tab IN VARCHAR2 := '%', 
      sch IN VARCHAR2 := USER,
      maxlen IN INTEGER := 30
      )
   RETURN ident_tabtype
   IS
      cur PLS_INTEGER := DBMS_SQL.OPEN_CURSOR;
      fdbk PLS_INTEGER;
      v_subst PLGadmin.dbmaxvc2;
      v_value PLGadmin.dbmaxvc2;

      curs PLGdoir.curinfo_tabtype;

      retval ident_tabtype;

      CURSOR ident_cur
      IS
         SELECT *
           FROM oir_identifier
          WHERE driver = UPPER (drv)
          ORDER BY ident_query;

      PROCEDURE bindvar (qry IN VARCHAR2, holder IN VARCHAR2, val IN VARCHAR2)
      IS
      BEGIN
         IF INSTR (qry, ':' || holder) > 0
         THEN
            DBMS_SQL.BIND_VARIABLE (cur, holder, val);
         END IF;
      END;

      PROCEDURE subst_and_check 
         (tab IN VARCHAR2, sch IN VARCHAR2, str IN OUT VARCHAR2, descrip IN VARCHAR2)
      IS
         v_row PLS_INTEGER;
      BEGIN
         PLGgen.substitute_string (drv, str, sch => sch);

         IF LENGTH (str) > maxlen
         THEN
            v_row := NVL (retval.LAST, 0) + 1;
            retval (v_row).sch := sch;
            retval (v_row).tab := tab;
            retval (v_row).subst := str;
            retval (v_row).descrip := descrip;
         END IF;
      END;

      PROCEDURE setup_and_check (
         obj IN VARCHAR2,
         sch IN VARCHAR2,
         subststr IN OUT VARCHAR2,
         descripstr IN VARCHAR2
         )
      IS
         v_row PLS_INTEGER := curs.FIRST;
      BEGIN
         /* OVERKILL: execute the check for N numbers of cursors, just IN CASE there is a nested
            reference to a cursor-related value. */

         SAVEPOINT override_plgdoir_cur_entries;
         LOOP
            IF v_row IS NOT NULL
            THEN
               /* Override normal settings. */
               PLGdoir.setdynvarchar2 (drv, 'CURNAME', '''' || curs(v_row).curname || '''');
               PLGdoir.setdynvarchar2 (drv, 'COLLIST', '''' || curs(v_row).collist || '''');
            END IF;

            subst_and_check (tab, sch, subststr, descripstr);

            v_row := curs.NEXT (v_row);

            EXIT WHEN v_row IS NULL;
         END LOOP;
         ROLLBACK TO override_plgdoir_cur_entries;
      END;

   BEGIN
      /* Load up customized cursors */
      curs := PLGdoir.curinfo (drv, tab, sch);

      FOR tab_rec IN tab_cur (tab, sch)
      LOOP
         FOR ident_rec IN ident_cur
         LOOP
            ident_rec.subst := UPPER (ident_rec.subst);

            IF ident_rec.ident_query IS NULL
            THEN
               setup_and_check (
                  tab_rec.object_name, 
                  tab_rec.owner, 
                  ident_rec.subst, 
                  ident_rec.descrip);
            ELSE
               DBMS_SQL.PARSE (cur,
                  ident_rec.ident_query,
                  DBMS_SQL.NATIVE);

               DBMS_SQL.DEFINE_COLUMN (cur, 1, v_value, 2000);

               bindvar (ident_rec.ident_query, 'OBJNAME', tab_rec.object_name);
               bindvar (ident_rec.ident_query, 'SCHEMA', tab_rec.owner);
               
               fdbk := DBMS_SQL.EXECUTE (cur);
               LOOP
                  EXIT WHEN DBMS_SQL.FETCH_ROWS (cur) = 0;
                  DBMS_SQL.COLUMN_VALUE (cur, 1, v_value);

                  v_subst :=
                     REPLACE (
                        ident_rec.subst, 
                        '[OBJNAME]', 
                        tab_rec.object_name);

                  v_subst :=
                     REPLACE (
                        v_subst, 
                        '[' || UPPER (ident_rec.ident_list) || ']', 
                        v_value);

                  setup_and_check (tab_rec.object_name, tab_rec.owner, v_subst, ident_rec.descrip);
               END LOOP;
            END IF;
         END LOOP;
      END LOOP;
      DBMS_SQL.CLOSE_CURSOR (cur);
      RETURN retval;
   END;

   PROCEDURE load_invalid_idents (
      drv IN VARCHAR2, 
      tab IN VARCHAR2 := '%', 
      sch IN VARCHAR2 := USER,
      maxlen IN INTEGER := 30
      )
   IS
   BEGIN
      g_invalid_idents := invalid_idents (drv, tab, sch, maxlen);
   END;
   
   PROCEDURE show_invalid_idents (
      drv IN VARCHAR2, 
      tab IN VARCHAR2 := '%', 
      sch IN VARCHAR2 := USER,
      maxlen IN INTEGER := 30)
   IS
      currsch PLGadmin.identifier;
      currtab PLGadmin.identifier;

      v_tab ident_tabtype;

      FUNCTION newobj (sch IN VARCHAR2, tab IN VARCHAR2) RETURN BOOLEAN
      IS
         retval BOOLEAN := currsch IS NULL or currtab IS NULL;
      BEGIN
         IF NOT retval
         THEN
            retval := currsch != sch OR currtab != tab;
         END IF;
         IF retval
         THEN
            currsch := sch;
            currtab := tab;
         END IF;
         RETURN retval;
      END;

      PROCEDURE disp_header (sch IN VARCHAR2, tab IN VARCHAR2)
      IS
      BEGIN
         DBMS_OUTPUT.PUT_LINE (RPAD ('-', 75, '-'));
         DBMS_OUTPUT.PUT_LINE ('Identifiers with > ' || maxlen || ' chars in ' || sch || '.' || tab);
         DBMS_OUTPUT.PUT_LINE (RPAD ('-', 75, '-'));
      END;

   BEGIN
      v_tab := invalid_idents (drv, tab, sch, maxlen);

      IF v_tab.COUNT > 0
      THEN
         FOR rowind IN v_tab.FIRST .. v_tab.LAST
         LOOP
            IF newobj (v_tab(rowind).sch, v_tab(rowind).tab)
            THEN
               disp_header (v_tab(rowind).sch, v_tab(rowind).tab);
            END IF;
            DBMS_OUTPUT.PUT_LINE (v_tab(rowind).subst);
            DBMS_OUTPUT.PUT_LINE ('   (' || v_tab(rowind).descrip || ')');
         END LOOP;

         DBMS_OUTPUT.PUT_LINE ('');
         DBMS_OUTPUT.PUT_LINE (RPAD ('*', 75, '*'));
         DBMS_OUTPUT.PUT_LINE ('REGARDING GENERATED IDENTIFIERS WITH INVALID NAMES:');
         DBMS_OUTPUT.PUT_LINE ('');
         DBMS_OUTPUT.PUT_LINE ('   Some of the invalid identifiers listed above may NOT actually');
         DBMS_OUTPUT.PUT_LINE ('   appear in your generated code and therefore not cause compile ');
         DBMS_OUTPUT.PUT_LINE ('   errors. If any identifiers were flagged as invalid, however,');
         DBMS_OUTPUT.PUT_LINE ('   you SHOULD consider changing your naming conventions to avoid');
         DBMS_OUTPUT.PUT_LINE ('   potential problems.');
         DBMS_OUTPUT.PUT_LINE ('');
         DBMS_OUTPUT.PUT_LINE (RPAD ('*', 75, '*'));
      END IF;
   END;

   FUNCTION num_invalid_idents RETURN INTEGER
   IS
   BEGIN
      RETURN g_invalid_idents.COUNT;
   END;

   PROCEDURE get_invalid_ident (
      nth IN INTEGER,
      sch OUT VARCHAR2,
      tab OUT VARCHAR2,
      ident OUT VARCHAR2,
      descr OUT VARCHAR2
      )
   IS
   BEGIN
      PLGerr.assert (
         nth BETWEEN 1 AND num_invalid_idents,
         'PLGval: the index is out of range for the Invalid Identifier List.');
    
      sch   := g_invalid_idents(nth).sch;
      tab   := g_invalid_idents(nth).tab;
      ident := g_invalid_idents(nth).subst;
      descr := g_invalid_idents(nth).descrip;
   END;

/* Validate table-column name conflict */   

   FUNCTION tabcol_conflicts (
      drv IN VARCHAR2, 
      tab IN VARCHAR2 := '%', 
      sch IN VARCHAR2 := USER,
      maxlen IN INTEGER := 30
      )
   RETURN tabcol_tabtype
   IS
      v_row PLS_INTEGER;
      retval tabcol_tabtype;

   BEGIN
      FOR tab_rec IN tab_cur (tab, sch)
      LOOP
         IF PLGcols.iscolumn (tab_rec.object_name, tab_rec.object_name, tab_rec.owner)
         THEN
            IF PLGdoir.alias_prefix (drv,
                  tab_rec.object_name,
                  'FLD', /* A better away around this hard-coding? */
                  tab_rec.owner) 
               ||
               PLGdoir.alias_suffix (drv,
                  tab_rec.object_name,
                  'FLD', /* A better away around this hard-coding? */
                  tab_rec.owner) 
               IS NULL
            THEN
               v_row := NVL (retval.LAST, 0) + 1;
               retval (v_row).sch := tab_rec.owner;
               retval (v_row).tab := tab_rec.object_name;
            END IF;
         END IF;
      END LOOP;

      RETURN retval;
   END;

   PROCEDURE load_tabcol_conflicts (
      drv IN VARCHAR2, 
      tab IN VARCHAR2 := '%', 
      sch IN VARCHAR2 := USER,
      maxlen IN INTEGER := 30
      )
   IS
   BEGIN
      g_tabcol_conflicts := tabcol_conflicts (drv, tab, sch);
   END;
   
   PROCEDURE show_tabcol_conflicts (
      drv IN VARCHAR2, 
      tab IN VARCHAR2 := '%', 
      sch IN VARCHAR2 := USER
      )
   IS
      v_tab tabcol_tabtype;

      PROCEDURE disp_header
      IS
      BEGIN
         DBMS_OUTPUT.PUT_LINE (RPAD ('-', 75, '-'));
         DBMS_OUTPUT.PUT_LINE ('Tables with Columns of Same Name and No Field Prefix');
         DBMS_OUTPUT.PUT_LINE (RPAD ('-', 75, '-'));
      END;

   BEGIN
      v_tab := tabcol_conflicts (drv, tab, sch);

      IF v_tab.COUNT > 0
      THEN
         disp_header;
         FOR rowind IN v_tab.FIRST .. v_tab.LAST
         LOOP
            DBMS_OUTPUT.PUT_LINE (v_tab(rowind).sch || '.' || v_tab(rowind).tab);
         END LOOP;
      END IF;
   END;

   FUNCTION num_tabcol_conflicts RETURN INTEGER
   IS
   BEGIN
      RETURN g_tabcol_conflicts.COUNT;
   END;

   PROCEDURE get_tabcol_conflicts (
      nth IN INTEGER,
      sch OUT VARCHAR2,
      tab OUT VARCHAR2
      )
   IS
   BEGIN
      PLGerr.assert (
         nth BETWEEN 1 AND num_tabcol_conflicts,
         'PLGval: the index is out of range for the Table-Column Conflicts List.');
    
      sch   := g_tabcol_conflicts(nth).sch;
      tab   := g_tabcol_conflicts(nth).tab;
   END;
   
END PLGval;
/

⌨️ 快捷键说明

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