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

📄 plgcons.spb

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

/*----------------------------------------------------------------
||                  PL/Vision Professional 
||----------------------------------------------------------------
||    File: PLGcons.spb
||  Author: Steven Feuerstein
||
|| This is a part of the PL/Vision Professional Code library.
|| Copyright (C) 1996-99 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
||
-----------------------------------------------------------------*/
   c_max CONSTANT INTEGER := 1000;

   v_cols PLGadmin.dbmaxvc2 := NULL;

   CURSOR cons_cur (sch VARCHAR2, tab VARCHAR2, 
     stat VARCHAR2, typ VARCHAR2)
   IS
      SELECT constraint_name,
             constraint_type,
             table_name,
             search_condition,
             r_owner,
             r_constraint_name,
             delete_rule,
             status
        FROM /* dba_ */ ALL_CONSTRAINTS
       WHERE owner = sch
         AND table_name = tab
         AND (constraint_type = typ OR typ IS NULL)
         AND (status = stat OR stat IS NULL);

   PROCEDURE clrcol
   IS
   BEGIN
      v_cols := NULL;
   END;

   PROCEDURE addcol (col IN VARCHAR2)
   IS
   BEGIN
      v_cols := v_cols || '^' || col || '^';
   END;

   FUNCTION newcol (col IN VARCHAR2) RETURN BOOLEAN
   IS
   BEGIN
      RETURN (INSTR (v_cols, '^' || col || '^') = 0 OR v_cols IS NULL);
   END;

   FUNCTION rowintab (
      tab_in IN ident_tabtype,
      val_in IN VARCHAR2,
      ignorecase IN BOOLEAN := FALSE
      )
   RETURN PLS_INTEGER
   IS
      v_val PLGadmin.identifier := val_in;
      retval PLS_INTEGER := tab_in.FIRST;
   BEGIN
      IF ignorecase
      THEN
         v_val := UPPER (v_val);
      END IF;

      LOOP
         EXIT WHEN retval IS NULL;
         IF ignorecase
         THEN
            EXIT WHEN v_val = UPPER (tab_in(retval));
         ELSE
            EXIT WHEN v_val = tab_in(retval);
         END IF;
         retval := tab_in.NEXT (retval);
      END LOOP;

      RETURN retval;
   END;

   PROCEDURE fortab (tab IN VARCHAR2,
      constab IN OUT cons_tabtype, 
      coltab IN OUT conscol_tabtype,
      sch IN VARCHAR2 := NULL,
      consstatus IN VARCHAR2 := NULL,
      constype IN VARCHAR2 := NULL,
      colsuffix IN VARCHAR2 := NULL,
      colprefix IN VARCHAR2 := NULL,
      identtag IN VARCHAR2 := NULL
      )
   IS
      ucolstab ident_tabtype;
   BEGIN
      fortab (
         tab, constab, coltab, ucolstab,
         sch, consstatus, constype,
         colsuffix, colprefix, identtag
         );
   END;

   PROCEDURE fortab (
      tab IN VARCHAR2,
      constab IN OUT cons_tabtype, 
      coltab IN OUT conscol_tabtype,
      ucolstab IN OUT ident_tabtype,
      sch IN VARCHAR2 := NULL,
      consstatus IN VARCHAR2 := NULL,
      constype IN VARCHAR2 := NULL,
      colsuffix IN VARCHAR2 := NULL,
      colprefix IN VARCHAR2 := NULL,
      identtag IN VARCHAR2 := NULL
      )
   IS
      v_tab PLGadmin.identifier := tab;
      v_pky PLGadmin.identifier;
      spec PLGobj.spec_type;
      cons_rec cons_cur%ROWTYPE;
      conscol_rec conscol_rectype;
      v_row PLS_INTEGER := 0;
      v_colrow PLS_INTEGER := 0;
      v_cum PLS_INTEGER := 0;
      v_abs_pos PLS_INTEGER := 0;
      v_token PLGadmin.identifier;
      v_delims PLGadmin.dbmaxvc2 :=
         TRANSLATE (PLGprs.plsql_delimiters, 'A"', 'A');
      sc ALL_CONSTRAINTS.SEARCH_CONDITION%TYPE;
      sctab PLGadmin.vc2000_tabtype;

   BEGIN
      constab.DELETE;
      coltab.DELETE;

      IF INSTR (v_tab, '.') = 0 AND sch IS NOT NULL
      THEN
         v_tab := sch || '.' || v_tab;
      END IF; 
      spec := PLGobj.convspec (v_tab);

      OPEN cons_cur (spec.owner, spec.name, consstatus, constype);
            
      LOOP
         FETCH cons_cur INTO cons_rec;
         EXIT WHEN cons_cur%NOTFOUND;
         v_row := NVL (constab.LAST, 0)+1;
         constab(v_row).constraint_name := cons_rec.constraint_name;
         constab(v_row).converted_constraint_name := cons_rec.constraint_name;
         constab(v_row).constraint_type := cons_rec.constraint_type;
         constab(v_row).table_name := cons_rec.table_name;

         constab(v_row).r_owner := cons_rec.r_owner;
         constab(v_row).r_constraint_name := cons_rec.r_constraint_name;

         constab(v_row).search_condition := cons_rec.search_condition;
         constab(v_row).converted_search_condition := NULL;

         constab(v_row).delete_rule := cons_rec.delete_rule;
         constab(v_row).status := cons_rec.status;

         constab(v_row).column_count := 0;
         constab(v_row).cumulative_column_count := 0;
         constab(v_row).starting_row := NULL;
         constab(v_row).starting_row := NULL;

         /* Parse out the condition. */
         IF RTRIM (cons_rec.search_condition) IS NOT NULL
         THEN
            sctab.DELETE; /* 1/28/99 Have to clear each time. */

            /* 99.2 7/99 - might have "COLNAME" IS NOT NULL */
            PLGprs.string (cons_rec.search_condition, sctab,
               delimiters_in => v_delims);

            clrcol; /* 1/7/99 Clear it anew for each constraint. */

            FOR tokenind IN sctab.FIRST .. sctab.LAST
            LOOP
               /* Search against table with PLGcols.iscolumn */
                  
               v_token := sctab(tokenind);

               IF PLGcols.iscolumn (spec.name, v_token, spec.owner)
               THEN
                  /* 99.2 strip off " and UPPER case it. */
                  IF SUBSTR (v_token, 1, 1) = '"'
                  THEN
                     v_token := TRANSLATE (v_token, 'A"', 'A');
                  END IF;
                  v_token := UPPER (v_token);
                  
                  IF newcol (v_token)
                  THEN
                     addcol (v_token);
                      
                     constab (v_row).column_count := constab (v_row).column_count + 1;
                     v_abs_pos := v_abs_pos + 1;
                     
                     v_colrow := PLGofst.shifted (v_row, c_max, 
                        constab(v_row).column_count, 1);

                     coltab(v_colrow).column_name := v_token;

                     /* 4/98 Build unique cols table. */
                     IF rowintab (ucolstab, v_token) IS NULL
                     THEN
                        ucolstab (NVL (ucolstab.LAST, 0) + 1) := v_token;
                     END IF;

                     coltab(v_colrow).abs_position := v_abs_pos;
                     
                     coltab(v_colrow).converted_column_name :=
                        identtag || colprefix || v_token || colsuffix || identtag;

                     v_token := coltab(v_colrow).converted_column_name;    
                      
                     IF constab(v_row).starting_row IS NULL -- tokenind = sctab.FIRST
                     THEN
                        constab(v_row).starting_row := v_colrow;
                     END IF;
                  ELSE
                     v_token := 
                        identtag || colprefix || v_token || colsuffix || identtag;
                  END IF; 
               END IF;
               
               constab (v_row).converted_search_condition := 
                  constab (v_row).converted_search_condition || v_token;
                  
            END LOOP;
            
            v_cum := v_cum + constab (v_row).column_count;
            constab (v_row).cumulative_column_count := v_cum;
         END IF;

         IF constab(v_row).column_count = 1 AND
            UPPER (constab (v_row).search_condition) =
               coltab(v_colrow).column_name || ' IS NOT NULL' 
         THEN
            constab(v_row).not_null := TRUE;
            IF LENGTH (coltab(v_colrow).column_name) < c_max_converted_length - 8
            THEN
               constab(v_row).converted_constraint_name := 
                  'NOTNULL_' || coltab(v_colrow).column_name;
            END IF;
         END IF;
      END LOOP;
      CLOSE cons_cur;
   EXCEPTION
      WHEN OTHERS
      THEN
         IF cons_cur%ISOPEN THEN CLOSE cons_cur; END IF;
         RAISE;
   END;

   FUNCTION nthcol 
      (coltab IN conscol_tabtype, consnum IN INTEGER, colnum IN INTEGER)
      RETURN conscol_rectype
   IS
      retval conscol_rectype;
   BEGIN
      retval := coltab (PLGofst.shifted (consnum, c_max, colnum, 1));
      RETURN retval;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         DBMS_OUTPUT.PUT_LINE('PLGcons.nthcol failed to retrieve '||
            PLGofst.shifted (consnum, c_max, colnum, 1));
   END;

   FUNCTION isconscol 
      (coltab IN conscol_tabtype, colname IN VARCHAR2)
      RETURN BOOLEAN
   IS
      v_col PLGadmin.identifier := UPPER (colname);
      v_row PLS_INTEGER := coltab.FIRST;
   BEGIN
      LOOP
         EXIT WHEN v_row IS NULL OR v_col = coltab(v_row).column_name;
         v_row := coltab.NEXT (v_row);
      END LOOP;
      RETURN v_row IS NOT NULL;
   END;

END PLGcons;                      
/


⌨️ 快捷键说明

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