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

📄 plggen.spb

📁 Oracle PL/SQL procedure generator (second generator type)
💻 SPB
📖 第 1 页 / 共 5 页
字号:
/* Formatted on 2001/07/01 08:13 (RevealNet Formatter v4.4.0) */
SET DEFINE OFF
CREATE OR REPLACE PACKAGE BODY PLGgen
IS
   
/*----------------------------------------------------------------
||                  PL/Generator from RevealNet
||----------------------------------------------------------------
||    File: PLGgen.spb
||  Author: Steven Feuerstein
||
|| This is a part of the PL/Generator Code library.
|| Copyright (C) 1998-1999 RevealNet, Inc.
|| All rights reserved.
||
|| For more information, call RevealNet at 1-800-REVEAL4
|| or check out our Web page: www.revealnet.com
||
||**************** Modification History **************************
|| Date     By     Description
|| -------- ------ -----------------------------------------------
|| 8/4/2000 SEF    Add parameters to fortab.
|| 7/2000   SEF    Add ability to save target info to plg_driver_source
|| 6/10/99  SEF    Veva's birthday! Add support for NEQ
|| 6/10/99  SEF    Veva's birthday! Fix to substitute_string calls to
||                 pass on the context, usually curlooprow.
|| 5/30/99  SEF    LTRIM iscomment.
|| 4/99     SEF    99.2 Move to single pass architecture
|| 4/99     SEF    99.1 Revamp conditional logic
|| 3-4/99   SEF    MANY changes for cgml exposure, check for trial version.
|| 1/7/99   SEF    Disable auto compilation capability. There are
||                 numerous problems.
|| 1/4/99   SEF    Adjust column deletions
|| 11/25/98 SEF    Major tuning and revamping - use of drv_array.
|| 11/98    SEF    Improve DML value processing (setdmlval).
|| 11/98    SEF    Strip out before and after from program calls to tune.
|| 9/24/98  SEF    Make sure that all calls to PLGdoir.alias passes the schema.
|| 9/98     SEF    Betweentext: only one allowed active in N nested loops.
||                 In other words, if you specify a BETWEEN it replaces
||                 any of the others.
|| 9/98     SEF    Add [exec] operand to language.
|| 9/98     SEF    Add support for code analysis (analyze_plsql) AND
||                 then move it to PLGplsql package.
|| 8/98     SEF    Remove reliance on column hash.
|| 5/98     SEF    Add support for encryption
|| 4/98     SEF    - Add support for unique cons columns to avoid
||                 invalid parameter list.
||                 - Allow prep file to have INCLUDE statements
||                 that are ignored.
|| 3/98     SEF    Put specialized prep and cust file handling in here.
||                 They are no longer regular driver files.
|| 1/98     SEF    Tune processing
|| 11/97    SEF    driver files placed in OIR. Clean up interface.
|| 06/24/97 SEF    Enhance for foreign key name resolution.
|| 04/97    SEF    Created: En route to Amsterdam
******************************************************************/

/* Constants and Global data */

   g_is_express                   BOOLEAN             := FALSE;
   g_display                      BOOLEAN             := FALSE;
   g_timer_start                  PLS_INTEGER             := 0;
   g_useoneoutlist                BOOLEAN             := FALSE;
   g_load_datasource              BOOLEAN              := TRUE;
   g_cleanup                      PLGadmin.vc2000_tabtype;
   /* 2000.2 */
   g_usenamex                     BOOLEAN             := FALSE;
   g_asis                         BOOLEAN             := FALSE;
   c_schema              CONSTANT PLGadmin.identifier     := USER;
   plsql_compile_error            EXCEPTION;
   PRAGMA exception_init (plsql_compile_error,  -6550);
   stop_generation                EXCEPTION;
   /* Used to detect infinite loops in the parsing engine. */
   g_maxiterations                PLS_INTEGER         := 10000;
   no_columns_found               EXCEPTION;
   c_targetstate         CONSTANT INTEGER                 := 0;
   c_loopstate           CONSTANT INTEGER                 := 2;
   c_ifstate             CONSTANT INTEGER                 := 3;
   c_inclstate           CONSTANT INTEGER                 := 4;
   /* Tagged elements for parsing */
   vt_isnull                      PLGadmin.identifier;
   vt_isnotnull                   PLGadmin.identifier;
   vt_append                      PLGadmin.identifier;
   vt_replace                     PLGadmin.identifier;
   vt_as                          PLGadmin.identifier;
   vt_save                        PLGadmin.identifier;
   vt_between                     PLGadmin.identifier;
   vt_startrow                    PLGadmin.identifier;
   vt_endrow                      PLGadmin.identifier;
   vt_sqlcode                     PLGadmin.identifier;
   vt_sqlerrm                     PLGadmin.identifier;
   vt_eq                          PLGadmin.identifier;
   vt_eq_len                      PLS_INTEGER             := 4;
   vt_neq                         PLGadmin.identifier;
   vt_neq_len                     PLS_INTEGER             := 5;
   vt_like                        PLGadmin.identifier;
   vt_like_len                    PLS_INTEGER             := 6;
   vt_in                          PLGadmin.identifier;
   vt_in_len                      PLS_INTEGER             := 4;
   vt_notin                       PLGadmin.identifier;
   vt_notin_len                   PLS_INTEGER             := 7;
   vt_or                          PLGadmin.identifier;
   vt_and                         PLGadmin.identifier;
   vt_or_len                      PLS_INTEGER             := 4;
   vt_and_len                     PLS_INTEGER             := 5;
   vt_colname                     PLGadmin.identifier;
   c_listoflists         CONSTANT CHAR (13)               := 'PLG$tempareas';
   g_listoflists                  PLS_INTEGER;
   /* Open/Close characters */
   g_objtagopen                   CHAR (1)           := c_open;
   g_objtagclose                  CHAR (1)          := c_close;
   g_idtag                        CHAR (1)          := c_idtag;
   g_aliasopen                    CHAR (1)      := c_aliasopen;
   g_aliasclose                   CHAR (1)     := c_aliasclose;
   g_dbg                          BOOLEAN             := FALSE;
   g_dbgsrc                       INTEGER              := NULL;
   g_dbgfile                      PLGadmin.dbmaxvc2    := NULL;
   g_autocommit                   BOOLEAN             := FALSE;
   g_line#                        PLS_INTEGER; -- current line number
   g_check_idents                 BOOLEAN              := TRUE;
   g_drvsrctype                   PLS_INTEGER
                                         := PLGdoir.c_dbtab;
   g_drvtrgtype                   PLS_INTEGER
                                          := PLGdoir.c_file;
   dyncur                         INTEGER;
   g_compile                      BOOLEAN             := FALSE;
   g_program_string               PLGadmin.maxvc2;
   /* Identifier sequence/uniqueness values. */
   g_ident_seq_len       CONSTANT PLS_INTEGER             := 3;
   g_ident_seq_max       CONSTANT PLS_INTEGER             := 999;
   g_ident_seq                    PLS_INTEGER;
   /* Locations of drivers and generated code. */
   g_drvdir                       PLGadmin.dbmaxvc2;
   g_drvdelim                     PLGadmin.dbmaxvc2;
   g_gendir                       PLGadmin.dbmaxvc2;
   g_gendelim                     PLGadmin.dbmaxvc2;

   /* Driver Array and Information */

   TYPE drv_array_rectype IS RECORD (
      original_line                 PLS_INTEGER,
      text                          PLGadmin.dbmaxvc2,
      ut_text                       PLGadmin.dbmaxvc2,
      firsttag                      PLGadmin.identifier,
      firsttagloc                   PLS_INTEGER,
      next_row                      PLS_INTEGER,
      prev_row                      PLS_INTEGER,
      firstset                      BOOLEAN);

   TYPE drv_array_tabtype IS TABLE OF drv_array_rectype
      INDEX BY BINARY_INTEGER;

   drv_array                      drv_array_tabtype;
   v_drv_array_encrypted          BOOLEAN;
   v_drv_max             CONSTANT PLS_INTEGER             := 100000;

   TYPE drv_info_t IS TABLE OF PLGdoir.drvrec_t
      INDEX BY BINARY_INTEGER;

   drv_info                       drv_info_t;
   /* Data structures for driver source array. */
   c_global_cust_seq     CONSTANT PLS_INTEGER             := -10;
   c_schema_cust_seq     CONSTANT PLS_INTEGER             := -20;
   c_object_cust_seq     CONSTANT PLS_INTEGER             := -30;
   /* Offset sequence number for includes. */
   c_include_seq_start   CONSTANT PLS_INTEGER             := -31;
   g_include_seq                  PLS_INTEGER
                                     := c_include_seq_start;
   g_last_drv_array_row           PLS_INTEGER;
   g_storing_text                 BOOLEAN             := FALSE;
   g_writeto                      code_target_t;

   /* Object Cache */
   /* Disabled
   TYPE aliascache_rectype IS RECORD (
      inuse BOOLEAN := FALSE,
      currinuse BOOLEAN := FALSE,
      delim CHAR(1),
      list PLGadmin.maxvc2,
      nmtab PLGadmin.vc2000_tabtype,
      sctab PLGadmin.vc2000_tabtype
      );

   g_aliascache aliascache_rectype;
   */

   PROCEDURE tmr_start
   IS
   BEGIN
      g_timer_start := DBMS_UTILITY.get_time;
   END;

   PROCEDURE tmr_end
   IS
   BEGIN
      g_timer :=
            g_timer
          + DBMS_UTILITY.get_time
          - g_timer_start;
   END;

   /* Local substitute. */
   PROCEDURE pl (str IN VARCHAR2)
   IS
   BEGIN
      IF LENGTH (str) > 80
      THEN
         DBMS_OUTPUT.put_line (SUBSTR (str, 1, 80));
         pl (SUBSTR (str, 81));
      ELSE
         DBMS_OUTPUT.put_line (str);
      END IF;
   END;

   FUNCTION escaping (str IN VARCHAR2)
      RETURN BOOLEAN
   IS
   BEGIN
      RETURN str LIKE '!%';
   END;

   /* Scan gencol table for matching column. */
   FUNCTION gencol_row (col IN VARCHAR2)
      RETURN PLS_INTEGER
   IS
      v_col    PLGadmin.identifier := UPPER (col);
      retval   PLS_INTEGER         := gencol.FIRST;
   BEGIN
      LOOP
         EXIT WHEN retval IS NULL
                OR v_col = gencol (retval).uppercolname;
         retval := gencol.NEXT (retval);
      END LOOP;

      RETURN retval;
   END;

   
/* Local valbyname function - bypass PLGvar */
   FUNCTION valbyname (str IN VARCHAR2, cur IN INTEGER
            := NULL)
      RETURN VARCHAR2
   IS
      fdbk     PLS_INTEGER;
      retval   PLGadmin.dbmaxvc2;
   BEGIN
      IF debugging
      THEN
         pl (   'VALBYNAME from "'
             || str
             || '"');
      END IF;

      DBMS_SQL.parse (
         dyncur,
            'BEGIN :val := '
         || str
         || '; END;',
         DBMS_SQL.native
      );
      DBMS_SQL.bind_variable (dyncur, 'val', 'a', 2000);
      fdbk := DBMS_SQL.EXECUTE (dyncur);
      DBMS_SQL.variable_value (dyncur, 'val', retval);
      RETURN retval;
   END;

   PROCEDURE dynproc (
      str       IN   VARCHAR2,
      showerr   IN   BOOLEAN := TRUE
   )
   IS
      fdbk   PLS_INTEGER;
   BEGIN
      DBMS_SQL.parse (
         dyncur,
            'BEGIN '
         || str
         || '; END;',
         DBMS_SQL.native
      );
      fdbk := DBMS_SQL.EXECUTE (dyncur);
   EXCEPTION
      WHEN OTHERS
      THEN
         IF showerr
         THEN
            pl (   'Dynproc failure: '
                || SQLERRM);
         END IF;
   END;

   
/* Directory and delimiter information */

   PROCEDURE setgenenv (
      drv   IN   VARCHAR2,
      sch   IN   VARCHAR2,
      tab   IN   VARCHAR2
   )
   IS
   BEGIN
      g_gendir := PLGdoir.gendir (drv, tab, sch);
      g_gendelim := PLGdoir.gendelim (drv, tab, sch);
      PLGerr.assert (
         g_gendir IS NOT NULL,
         'You must specify a generation directory with PLGdoir.setgendir.'
      );
   END;

   PROCEDURE setdrvenv (
      drv   IN   VARCHAR2,
      sch   IN   VARCHAR2,
      tab   IN   VARCHAR2
   )
   IS
   BEGIN
      g_drvdir := PLGdoir.drvdir (drv, tab, sch);
      g_drvdelim := PLGdoir.drvdelim (drv, tab, sch);
      PLGerr.assert (
         g_drvdir IS NOT NULL,
         'You must specify a driver directory with a call to PLGdoir.setdrvdir.'
      );
   END;

   
/* Toggles */

   PROCEDURE autocommit
   IS
   BEGIN
      g_autocommit := TRUE;
   END;

   PROCEDURE noautocommit
   IS
   BEGIN
      g_autocommit := FALSE;
   END;

   FUNCTION autocommitting
      RETURN BOOLEAN
   IS
   BEGIN
      RETURN g_autocommit;
   END;

   /* Debug mechanism */

   PROCEDURE dbg (
      srcnum   IN   INTEGER := 0,
      FILE     IN   VARCHAR2 := NULL
   )
   IS
   BEGIN
      g_dbg := TRUE;
      g_dbgsrc := srcnum;
      g_dbgfile := NULL;
   END;

   PROCEDURE setdbg (srcnum IN INTEGER := 0)
   IS
   BEGIN
      g_dbg := NVL (g_dbgsrc, -9999) = srcnum;
   END;

   PROCEDURE nodbg
   IS
   BEGIN
      g_dbg := FALSE;
      g_dbgsrc := NULL;
      g_dbgfile := NULL;
   END;

   FUNCTION debugging (srcnum IN INTEGER := 0)
      RETURN BOOLEAN
   IS
   BEGIN
      RETURN    g_dbg
             OR (g_dbgsrc = srcnum);
   END;

   PROCEDURE set_maxiterations (num IN INTEGER)
   IS
   BEGIN
      g_maxiterations := NVL (num, 100000);
   END;

   FUNCTION maxiterations
      RETURN INTEGER
   IS
   BEGIN
      RETURN g_maxiterations;
   END;

   
/* Private Programs */

   FUNCTION writing_dbtab
      RETURN BOOLEAN
   IS
   BEGIN
      RETURN      NOT oneoutlist
              AND (   is_express_version
                   OR g_drvtrgtype = PLGdoir.c_dbtab
                  );
   END;

   FUNCTION writing_file
      RETURN BOOLEAN
   IS
   BEGIN
      RETURN      NOT oneoutlist
              AND (    NOT is_express_version
                   AND g_drvtrgtype = PLGdoir.c_file
                  );
   END;

   FUNCTION writing_list
      RETURN BOOLEAN
   IS
   BEGIN
      RETURN    oneoutlist
             OR (    NOT is_express_version
                 AND g_drvtrgtype = PLGdoir.c_list
                );
   END;

   FUNCTION reading_dbtab
      RETURN BOOLEAN
   IS
   BEGIN
      RETURN      NOT oneoutlist
              AND (   is_express_version
                   OR g_drvsrctype = PLGdoir.c_dbtab
                  );
   END;

   FUNCTION reading_file
      RETURN BOOLEAN
   IS

⌨️ 快捷键说明

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