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

📄 plggen.tst

📁 Oracle PL/SQL procedure generator (second generator type)
💻 TST
📖 第 1 页 / 共 5 页
字号:
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
|| -------- ------ -----------------------------------------------
|| 6/10/99  SEF    Veva's birthday! Add support for NEQ
|| 6/10/99  SEF    Veva's birthday! Fix to subst_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;
   
   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_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,
      firstNonSpace PLS_INTEGER,
      next_row PLS_INTEGER,
      prev_row PLS_INTEGER
      );

   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
      retval PLS_INTEGER  := gencol.FIRST;
   BEGIN
      LOOP
         EXIT WHEN retval IS NULL OR col = gencol(retval).colname;
         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
      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
   BEGIN
      RETURN NOT OneOutList AND
             (NOT is_express_version AND g_drvsrctype = PLGdoir.c_file);
   END;

   FUNCTION reading_list RETURN BOOLEAN
   IS
   BEGIN
      RETURN OneOutList OR
             (NOT is_express_version AND g_drvsrctype = PLGdoir.c_list);
   END;

   FUNCTION curlooprow (
      loop_in IN VARCHAR2,
      row_in IN PLS_INTEGER,
      pkg_in IN VARCHAR2 := 'PLGgen') RETURN VARCHAR2
   IS
   BEGIN
      RETURN pkg_in || '.' || loop_in || '(' || row_in ||').';
   END;

   FUNCTION curlooprow RETURN VARCHAR2
   IS
   BEGIN
      RETURN curlooprow (
         loopstate.statevar, loopstate.currrow, loopstate.pkgname);
   END;

   PROCEDURE init_src_trg_info (
      drv IN VARCHAR2,
      tab IN VARCHAR2,
      sch IN VARCHAR2 := NULL)
   IS
   BEGIN
      /* Set the source for the driver and target for the generated code. */

      g_drvsrctype :=
         NVL (
            PLGdoir.drvsrctype (drv, tab, sch), g_drvsrctype
            );

      g_drvtrgtype :=
         NVL (
            PLGdoir.drvtrgtype (drv, tab, sch), g_drvtrgtype
            );

      /* CANCELED: 99.2 Always do this -- customization files
         have to read from file.
      */
      IF g_drvsrctype = PLGdoir.c_file
      THEN
         setdrvenv (drv, sch, tab);
      END IF;

      IF g_drvtrgtype = PLGdoir.c_file
      THEN
         setgenenv (drv, sch, tab);
      END IF;

   END;

⌨️ 快捷键说明

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