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

📄 plggen.sps

📁 Oracle PL/SQL procedure generator (second generator type)
💻 SPS
📖 第 1 页 / 共 2 页
字号:
CREATE OR REPLACE PACKAGE PLGgen &authidopen AUTHID CURRENT_USER &authidclose

/* Table Package Generator */

/*----------------------------------------------------------------
||                  PL/Generator from RevealNet
||----------------------------------------------------------------
||    File: PLGgen.sps
||  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
||	-------- ------ -----------------------------------------------
|| 3/00     SEF    Add [set]comment capability
|| 4/99     SEF    99.1.1 Revamp conditional logic
|| 1/4/99   SEF    Remove use of colrecdmlval
|| 9/98     SEF    Add support for code analysis (analyze_plsql)
|| 06/24/97 SEF    Enhance for foreign key name resolution.
|| 04/97    SEF    Created
-----------------------------------------------------------------*/
IS
   c_asis CONSTANT CHAR(1) := '\';
   c_asis_wild CONSTANT CHAR(2) := '\%';
   c_asis_translate CONSTANT CHAR(2) := 'A\';
   c_translate CONSTANT CHAR(1) := 'A';

   g_timer PLS_INTEGER := 0;

/* Public global areas containing object information */

   /* One Out List */
   oneOutList_t PLGadmin.vc2000_tabtype;

   TYPE code_target_t IS RECORD
      (fileid UTL_FILE.FILE_TYPE,
       listid PLS_INTEGER,
       templistid PLS_INTEGER,
       inuse BOOLEAN,
       listseq PLS_INTEGER,
       listnum PLS_INTEGER := 0
       );

   TYPE obj_rectype IS RECORD (
      owner ALL_OBJECTS.OWNER%TYPE,
      name ALL_OBJECTS.OBJECT_NAME%TYPE,
      type ALL_OBJECTS.OBJECT_TYPE%TYPE);

   TYPE obj_tabtype IS TABLE OF obj_rectype INDEX BY BINARY_INTEGER;

   dbobject obj_tabtype;

   /* Invalid identifiers list */
   TYPE invalid_ident_rectype IS RECORD (
      driver PLGadmin.identifier,
      owner PLGadmin.identifier,
      name PLGadmin.identifier,
      type PLGadmin.identifier,
      alias PLG_doir.info%TYPE,
      alias_description PLG_doir.doc%TYPE,
      ident PLGadmin.dbmaxvc2,
      new_ident PLGadmin.identifier
      );

   TYPE invalid_ident_tabtype IS TABLE OF invalid_ident_rectype
      INDEX BY BINARY_INTEGER;

   invalid_idents invalid_ident_tabtype;

   TYPE gencoltab IS TABLE OF PLGgenv.colrectype INDEX BY BINARY_INTEGER;

   /* Contains all column-level information */
   gencol gencoltab;

   /* Basic column information */
   col PLGcols.col_tabtype;

   /* Consolidate information in own tables. Communicate with gencol
      via a hash table on column name. */

   ind   PLGinds.ind_tabtype;
   indcol PLGinds.indcol_tabtype;

   uind   PLGinds.ind_tabtype;
   uindcol PLGinds.indcol_tabtype;

   fky    PLGfkys.fky_tabtype;
   fkycol PLGfkys.fkycol_tabtype;

   fkydesc    PLGinds.ind_tabtype;
   fkydesccol PLGinds.indcol_tabtype;

   pkycol  PLGpky.pky_tabtype;
   desccol PLGinds.indcol_tabtype;

   cons    PLGcons.cons_tabtype;
   conscol PLGcons.conscol_tabtype;

   curs PLGdoir.curinfo_tabtype;

   TYPE integer_tabtype IS TABLE OF PLS_INTEGER
       INDEX BY BINARY_INTEGER;

   /* Values in these tables point to rows in gencol */
   nonpkycol  integer_tabtype;
   updcol     integer_tabtype;
   notnullcol integer_tabtype;
   uconscol   integer_tabtype;

   loop_hash integer_tabtype;
   col_hash integer_tabtype;

   /* Code analysis tables. */
   prog PLGdesc.prog_tt;
   -- Not in use progsep PLGdesc.progsep_tt;
   arg PLGdesc.arglist_tt;
   retarg PLGdesc.arglist_tt;

   /* Stack of states for looping. */
   TYPE state_tab IS TABLE OF PLGgenv.genrectype INDEX BY BINARY_INTEGER;
   genstate state_tab;

   /* State stack structure */

   TYPE state_stk_type IS RECORD (
      statetype PLS_INTEGER,
      currrow PLS_INTEGER,
      nthrow PLS_INTEGER,
      startrow PLS_INTEGER,
      endrow PLS_INTEGER,
      startend_override BOOLEAN,
      statecommand PLGadmin.identifier,
      statevar PLGadmin.identifier,
      statelabel PLGadmin.identifier,
      pretext PLGadmin.identifier, /* opposite of between; on all but first, in front. */
      at_first_line BOOLEAN, /* TRUE if putting first line in loop */
      betweentext VARCHAR2(100),
      /* 2000.2 */
      appendtext VARCHAR2(100), /* text to be appended to EVERY line in loop */
      astext VARCHAR2(100),
      istrue BOOLEAN,
      pkgname PLGadmin.identifier /* for loops, stored in PLGdoir */
      --aftertext VARCHAR2(100),
      --beforetext VARCHAR2(100),
      --lstriptext VARCHAR2(100),
      --rstriptext VARCHAR2(100),
      );

   TYPE state_stk_tabtype IS TABLE OF state_stk_type INDEX BY BINARY_INTEGER;
   loop_stack state_stk_tabtype;

   empty_staterec state_stk_type;
   targetstate state_stk_type;
   ifstate state_stk_type;
   loopstate state_stk_type;
   inclstate state_stk_type;

   /* Constants */

   g_ident_length INTEGER := 30;

   /* These constants should really be in plgte!
      I will place a copy there for use with the setting of arrays. */
   c_colname CONSTANT CHAR(7) := 'COLNAME';
   c_pkycol CONSTANT CHAR(6) := 'PKYCOL';
   c_desccol CONSTANT CHAR(7) := 'DESCCOL';
   c_sequence CONSTANT CHAR(8) := 'SEQUENCE';
   c_nonpkycol CONSTANT CHAR(9) := 'NONPKYCOL';
   c_fky CONSTANT CHAR(3) := 'FKY';
   c_fkycol CONSTANT CHAR(6) := 'FKYCOL';
   c_fkydesc CONSTANT CHAR(7) := 'FKYDESC';
   c_fkydesccol CONSTANT CHAR(10) := 'FKYDESCCOL';
   c_updcol CONSTANT CHAR(6) := 'UPDCOL';
   c_notnullcol CONSTANT CHAR(10) := 'NOTNULLCOL';
   c_col CONSTANT CHAR(3) := 'COL';
   c_uind CONSTANT CHAR(4) := 'UIND';
   c_uindcol CONSTANT CHAR(7) := 'UINDCOL';
   c_ind CONSTANT CHAR(3) := 'IND';
   c_indcol CONSTANT CHAR(6) := 'INDCOL';
   c_cons CONSTANT CHAR(4) := 'CONS';
   c_conscol CONSTANT CHAR(7) := 'CONSCOL';
   c_uconscol CONSTANT CHAR(8) := 'UCONSCOL';

   c_prog       CONSTANT CHAR(4) := 'PROG';
   c_progsep    CONSTANT CHAR(7) := 'PROGSEP';
   c_arg        CONSTANT CHAR(3) := 'ARG';
   c_retarg     CONSTANT CHAR(6) := 'RETARG';
   c_argsep     CONSTANT CHAR(6) := 'ARGSEP';
   c_argfromsep CONSTANT CHAR(10) := 'ARGFROMSEP';

   /* CGML syntax elements */
   c_open       CONSTANT CHAR(1) := '[';
   c_close      CONSTANT CHAR(1) := ']';
   c_aliasopen  CONSTANT CHAR(1) := '{';
   c_aliasclose CONSTANT CHAR(1) := '}';
   c_idtag     CONSTANT CHAR(1) := '^';
   c_substopen  CONSTANT CHAR(1) := CHR(8);
   c_substclose CONSTANT CHAR(1) := CHR(9);

   c_foreach CONSTANT CHAR(7) := 'FOREACH';
   c_endforeach CONSTANT CHAR(10) := 'ENDFOREACH';
   c_endforeach2 CONSTANT CHAR(8) := '\FOREACH';

   /* Special set options */
   c_object CONSTANT CHAR(6) := 'OBJECT';
   c_driver CONSTANT CHAR(6) := 'DRIVER';
   c_driver_type CONSTANT CHAR(10) := 'DRIVERTYPE';
   c_aliastag CONSTANT CHAR(8) := 'ALIASTAG';
   c_objecttag CONSTANT CHAR(9) := 'OBJECTTAG';

   c_start_cust_line CONSTANT VARCHAR2(50) := '/* PL/Generator CUSTOMIZE START */';
   c_end_cust_line CONSTANT VARCHAR2(50) := '/* PL/Generator CUSTOMIZE END */';

   /* Conditional Logic Constants */
   c_if CONSTANT CHAR(2) := 'IF';
   c_ifnot CONSTANT CHAR(5) := 'IFNOT';
   c_else CONSTANT CHAR(4) := 'ELSE';
   c_elsif CONSTANT CHAR(5) := 'ELSIF';
   c_elsifnot CONSTANT CHAR(8) := 'ELSIFNOT';
   c_elseif CONSTANT CHAR(6) := 'ELSEIF';
   c_elseifnot CONSTANT CHAR(9) := 'ELSEIFNOT';
   c_endif CONSTANT CHAR(5) := 'ENDIF';
   c_endif2 CONSTANT CHAR(3) := '\IF';
   c_end_if CONSTANT CHAR(6) := 'END IF';

   c_eq CONSTANT CHAR(2) := 'EQ';
   c_neq CONSTANT CHAR(3) := 'NEQ';
   c_and CONSTANT CHAR(3) := 'AND';
   c_or CONSTANT CHAR(2) := 'OR';
   c_isnull CONSTANT CHAR(6) := 'ISNULL';
   c_isnotnull CONSTANT CHAR(9) := 'ISNOTNULL';
   c_like CONSTANT CHAR(4) := 'LIKE';
   c_in CONSTANT CHAR(2) := 'IN';
   c_notin CONSTANT CHAR(5) := 'NOTIN';
   c_delim CONSTANT CHAR(1) := ',';

   c_set CONSTANT CHAR(3) := 'SET';
   c_as CONSTANT CHAR(2) := 'AS';
   c_save CONSTANT CHAR(4) := 'SAVE';
   c_exec CONSTANT CHAR(4) := 'EXEC';
   c_execrto CONSTANT CHAR(7) := 'EXECRTO';
   c_execfile CONSTANT CHAR(8) := 'EXECFILE';
   c_append CONSTANT CHAR(6) := 'APPEND';
   c_stop CONSTANT CHAR(4) := 'STOP';

   c_asis_tag CONSTANT CHAR(4) := 'ASIS';
   c_endasis  CONSTANT CHAR(7) := 'ENDASIS';
   c_endasis2 CONSTANT CHAR(7) := '\ASIS';
   
   c_header       CONSTANT CHAR(6) := 'HEADER';
   c_include      CONSTANT CHAR(7) := 'INCLUDE';
   c_defarray     CONSTANT CHAR(8) := 'DEFARRAY';
   c_enddefarray  CONSTANT CHAR(11) := 'ENDDEFARRAY';
   c_enddefarray2 CONSTANT CHAR(9) := '\DEFARRAY';
   c_deftabarray  CONSTANT CHAR(11) := 'DEFTABARRAY';
   c_defqryarray  CONSTANT CHAR(11) := 'DEFQRYARRAY';
   c_storein      CONSTANT CHAR(7) := 'STOREIN';
   c_close_cmd    CONSTANT CHAR(5) := 'CLOSE';
   c_special      CONSTANT CHAR(7) := 'SPECIAL';
   c_raise        CONSTANT CHAR(5) := PLGdoir.c_raise;
   c_handle       CONSTANT CHAR(6) := PLGdoir.c_handle;
   c_totemp       CONSTANT CHAR(6) := 'TOTEMP';
   c_tofile       CONSTANT CHAR(6) := 'TOFILE';
   c_totarget     CONSTANT CHAR(8) := 'TOTARGET';
   c_rto          CONSTANT CHAR(3) := 'RTO';
   c_endtotemp    CONSTANT CHAR(9) := 'ENDTOTEMP';
   c_endtofile    CONSTANT CHAR(9) := 'ENDTOFILE';
   c_endtotarget CONSTANT CHAR(11) := 'ENDTOTARGET';
   c_endtotemp2   CONSTANT CHAR(7) := '\TOTEMP';
   c_endtofile2   CONSTANT CHAR(7) := '\TOFILE';
   c_endtotarget2 CONSTANT CHAR(9) := '\TOTARGET';
   c_endrto       CONSTANT CHAR(6) := 'ENDRTO';
   c_endrto2      CONSTANT CHAR(4) := '\RTO';
   c_setalias     CONSTANT CHAR(8) := 'SETALIAS';
   c_cleanup      CONSTANT CHAR(7) := 'CLEANUP';
   c_endcleanup   CONSTANT CHAR(10) := 'ENDCLEANUP';
   c_endcleanup2  CONSTANT CHAR(8) := '\CLEANUP';
   c_docleanup    CONSTANT CHAR(9) := 'DOCLEANUP';
   c_clearcleanup CONSTANT CHAR(12) := 'CLEARCLEANUP';
   c_setcomment   CONSTANT CHAR(7) := 'COMMENT';

   /* Not a great way to do this, but will do for now. Make sure to
      terminate the strings with a , */

   c_cgml_start_commands VARCHAR2(2000) :=
      'FOREACH,ENDFOREACH,\FOREACH,OBJECT,DRIVER,IF,IFNOT,' ||
      'ELSE,ELSIF,ELSIFNOT,ELSEIF,ELSEIFNOT,ENDIF,\IF,END IF,' ||
      'SET,EXEC,EXECRTO,EXECFILE,STOP,HEADER,INCLUDE,STOREIN,' ||
      'CLOSE,SPECIAL,RAISE,HANDLE,TOTEMP,TOFILE,TOTARGET,RTO,' ||
      'ENDTOTEMP,ENDTOFILE,ENDTOTARGET,\TOTEMP,\TOFILE,\TOTARGET,ENDRTO,\RTO,' ||
      'SETALIAS,DEFTABARRAY,DEFARRAY,DEFQRYARRAY,' ||
      'CLEANUP,ENDCLEANUP,DOCLEANUP,CLEARCLEANUP,ASIS,ENDASIS,\ASIS';

   c_cgml_embedded_commands VARCHAR2(2000) :=
      'EQ,NEQ,LIKE,AND,OR,ISNULL,ISNOTNULL,AS,APPEND,REPLACE,BETWEEN,' ||
      'STARTROW,ENDROW,SQLCODE,SQLERRM,SAVE';

⌨️ 快捷键说明

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