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

📄 plggen.tst

📁 Oracle PL/SQL procedure generator (second generator type)
💻 TST
📖 第 1 页 / 共 5 页
字号:
            staterec.statevar || '-' ||
            staterec.statelabel || '-' ||
            --staterec.beforetext || '-' ||
            --staterec.aftertext || '-' ||
            staterec.betweentext || '-' ||
            staterec.startrow || '-' ||
            staterec.endrow);
      END IF;
   END;

   PROCEDURE drv_array_add (
      drvrec IN OUT PLGdoir.drvrec_t,
      txt IN VARCHAR2,
      encr IN BOOLEAN,
      prev_row IN PLS_INTEGER := NULL,
      curr_row IN PLS_INTEGER := NULL)
   IS
      v_line plgadmin.dbmaxvc2 := txt;
      v_row PLS_INTEGER := drvrec.last_row;
   BEGIN
      IF iscomment (v_line)
      THEN
         /* Skip the comment... */
         NULL;
      ELSE
         IF encr
         THEN
            v_line := PLGadmin.decrypt (v_line);
         END IF;

         IF drvrec.last_row IS NULL
         THEN
            v_row := PLGofst.first (drvrec.seq, v_drv_max, 1);
         ELSE
            v_row := drvrec.last_row + 1;
            --v_row := PLGofst.shifted (drvrec.seq, v_drv_max, drvrec.last_row+1, 1);
         END IF;

         IF debugging AND FALSE
         THEN
            pl ('drv_array_add to row ' || v_row);
         END IF;

         /* 99.2 RTRIM everything */

         drv_array(v_row).text := RTRIM (v_line);
         drv_array(v_row).ut_text := /* 99.2 Trim tabs also */
            UPPER (LTRIM (LTRIM (drv_array(v_row).text), CHR(9)));
         drv_array(v_row).next_row := v_row + 1;
         drv_array(v_row).original_line := curr_row;
         drv_array(v_row).firsttagloc :=
            INSTR (drv_array(v_row).ut_text, objtagopen);
         IF drv_array(v_row).firsttagloc > 0
         THEN
            drv_array(v_row).firstTag :=
               PLGstr.betwn (
                  drv_array(v_row).ut_text,
                  objtagopen,
                  objtagclose,
                  inclusive=>FALSE);
         END IF;

         /*
         IF PLGgenv.genrec.relSpacing
         THEN
            DECLARE
               v_char CHAR(1);
               v_loc PLS_INTEGER;
            BEGIN
               LOOP
                  v_char := SUBSTR (drv_array(v_row).text, v_loc, 1);
                  EXIT WHEN v_char != ' ';
                  v_loc := v_loc + 1;
               END LOOP;
            END;
         END IF;
         */

         IF prev_row IS NOT NULL
         THEN
            drv_array(v_row).prev_row := prev_row;
            drv_array(prev_row).next_row := v_row;
         ELSE
            drv_array(v_row).prev_row := v_row - 1;
         END IF;

         IF debugging AND FALSE
         THEN
            pl ('drv_array_add to row ' || v_row ||
               ' next ' || drv_array(v_row).next_row ||
               ' prev ' || drv_array(v_row).prev_row || ': ' || v_line);
         END IF;

         /* Last row set in this pass. */
         drvrec.last_row := v_row;
      END IF;
   END;

   PROCEDURE drv_array_terminate (
      drvrec IN OUT PLGdoir.drvrec_t,
      row IN PLS_INTEGER := NULL)
   IS
   BEGIN
      IF debugging
      THEN
         pl ('terminate seq ' || drvrec.seq || ' at last row '|| drvrec.last_row
            || ' with ' || row);
      END IF;

      IF drvrec.last_row IS NOT NULL
      THEN
         drv_array(drvrec.last_row).next_row := row;
      END IF;
   END;

   PROCEDURE drv_array_delete (seq IN PLS_INTEGER := NULL)
   IS
   BEGIN
      IF seq IS NULL /* Complete clean up */
      THEN
         drv_array.DELETE;
         drv_info.DELETE;
         g_include_seq := c_include_seq_start;
      ELSE
         drv_info.DELETE (seq);
         drv_array.DELETE (
            PLGofst.first (seq, v_drv_max, 1),
            PLGofst.last (seq, v_drv_max, 1)
            );
      END IF;
   END;

   FUNCTION drv_array_start (seq IN PLS_INTEGER) RETURN PLS_INTEGER
   IS
   BEGIN
      RETURN PLGofst.first (seq, v_drv_max, 1);
   END;

   FUNCTION drv_array_end (seq IN PLS_INTEGER) RETURN PLS_INTEGER
   IS
   BEGIN
      RETURN drv_array.PRIOR (PLGofst.last (seq, v_drv_max, 1)+1);
   END;

   FUNCTION drv_array_exists (row IN PLS_INTEGER) RETURN BOOLEAN
   IS
   BEGIN
      RETURN drv_array.EXISTS (row);
   END;

   FUNCTION drv_array_next (row IN PLS_INTEGER,
      native_error IN BOOLEAN := FALSE) RETURN PLS_INTEGER
   IS
      retval PLS_INTEGER;
   BEGIN
      IF row IS NOT NULL
      THEN
         retval := NVL (drv_array(row).next_row, row + 1);
      END IF;
      RETURN retval;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         IF native_error THEN RAISE;
         ELSE
         PLGerr.raise (
            PLGerr.read_error,
            'Attempt to get next drv_array row touched undefined row ' || row);
         END IF;
   END;

   PROCEDURE set_drv_array_next (row_in IN PLS_INTEGER, nextrow IN PLS_INTEGER)
   IS
   BEGIN
      drv_array(row_in).next_row := nextrow;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         PLGerr.raise ('Unable to get drv array next text for row ' || row_in);
   END;

   FUNCTION drv_array_prev (row_in IN PLS_INTEGER) RETURN PLS_INTEGER
   IS
   BEGIN
      IF row_in IS NULL
      THEN
         RETURN NULL;
      ELSE
         RETURN drv_array(row_in).prev_row;
      END IF;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         PLGerr.raise ('Unable to get drv array prev text for row ' || row_in);
   END;

   FUNCTION drv_array_text (row_in IN PLS_INTEGER) RETURN VARCHAR2
   IS
   BEGIN
      RETURN drv_array(row_in).text;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         PLGerr.raise ('Unable to get drv array text for row ' || row_in);
   END;

   FUNCTION drv_array_ut_text (row_in IN PLS_INTEGER) RETURN VARCHAR2
   IS
   BEGIN
      RETURN drv_array(row_in).ut_text;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         PLGerr.raise ('Unable to get drv array UT text for row ' || row_in);
   END;

   FUNCTION drv_array_firstTag (
      row_in IN PLS_INTEGER, native_error IN BOOLEAN := FALSE) RETURN VARCHAR2
   IS
   BEGIN
      RETURN drv_array(row_in).firstTag;
   EXCEPTION
      WHEN NO_DATA_FOUND 
      THEN
         IF native_error THEN RAISE;
         ELSE
            PLGerr.raise ('Unable to get first tag for row ' || row_in);
         END IF;
   END;

   FUNCTION drv_array_firstTagLoc (
      row_in IN PLS_INTEGER) RETURN PLS_INTEGER
   IS
   BEGIN
      RETURN drv_array(row_in).firstTagLoc;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         PLGerr.raise ('Unable to get first tag location for row ' || row_in);
   END;

   FUNCTION drv_array_ut_text (text_in IN VARCHAR2) RETURN VARCHAR2
   IS
   BEGIN
      RETURN UPPER (LTRIM (text_in));
   END;

   PROCEDURE check_identifiers (
      drvtext_str IN VARCHAR2,
      genstr IN OUT VARCHAR2
      )
   IS
      v_startloc PLS_INTEGER;
      v_endloc PLS_INTEGER;
      v_nthoccur PLS_INTEGER := 1;
      v_orig_identifier PLGadmin.dbmaxvc2;
      v_alias_identifier PLGadmin.dbmaxvc2;
      v_alias PLGadmin.dbmaxvc2;
      v_orig_alias PLGadmin.dbmaxvc2;
      v_lower_genstr PLGadmin.maxvc2 := LOWER (genstr);

      FUNCTION invalid_identifier (str IN VARCHAR2) RETURN BOOLEAN
      IS
         v_dotloc PLS_INTEGER := INSTR (str, '.');
         v_len PLS_INTEGER := LENGTH (str);
         retval BOOLEAN := FALSE;
      BEGIN
         IF v_dotloc = 0
         THEN
            retval :=
               v_len > g_ident_length;
         /*
         ELSE
            -- Check right and left sides...but more than one dot?
            retval :=
               invalid_identifier (SUBSTR (str, 1, v_dotloc-1)) OR
               invalid_identifier (SUBSTR (str, v_dotloc+1))
               ;
         */
         END IF;

         RETURN retval;
      END;

      PROCEDURE record_identifier_problem (
         ident IN VARCHAR2,
         new_ident IN VARCHAR2,
         alias IN VARCHAR2,
         alias_descrip IN VARCHAR2)
      IS
         v_row PLS_INTEGER;
      BEGIN
         /* Only add it if it is not already present. */
         v_row := invalid_idents.FIRST;
         LOOP
            EXIT WHEN
               v_row IS NULL
               OR
               invalid_idents (v_row).new_ident = new_ident;
            v_row := invalid_idents.NEXT (v_row);
         END LOOP;

         IF v_row IS NULL
         THEN
            v_row := NVL (invalid_idents.LAST, 0) + 1;
            invalid_idents (v_row).driver := PLGgenv.genrec.driver;
            invalid_idents (v_row).owner := PLGgenv.genrec.schema;
            invalid_idents (v_row).name := PLGgenv.genrec.objname;
            invalid_idents (v_row).type := PLGgenv.genrec.target;
            invalid_idents (v_row).alias := alias;
            invalid_idents (v_row).alias_description := alias_descrip;
            invalid_idents (v_row).ident := ident;
            invalid_idents (v_row).new_ident := new_ident;
         END IF;
      END;

      FUNCTION fixed_identifier (ident_alias IN VARCHAR2) RETURN VARCHAR2
      IS
         v_row PLS_INTEGER := invalid_idents.first;
         foundit BOOLEAN := FALSE;
         retval PLGadmin.identifier;
      BEGIN
         LOOP
            EXIT WHEN v_row IS NULL OR foundit;
            foundit := invalid_idents (v_row).ident = ident_alias;
            IF foundit
            THEN
               retval := invalid_idents(v_row).new_ident;
            ELSE
               v_row := invalid_idents.NEXT (v_row);
            END IF;
         END LOOP;
         RETURN retval;
      END;

   BEGIN
      /*
         drvtext_str example: PROCEDURE ^{openbypkycurproc}^ (^second_identifier^,
         genstr example: PROCEDURE ^open_emp_long_tab_fk2bypky_cur^ (^what_a_long_argument_name^,
      */

      /*
         For each identifier in genstr, extract the value, do a final aliasing,
         perform validations, such as name too long, and if a problem, go back
         to drvtext_str and find the original name and log it to an error stack for
         later display/manipulation.
      */
      LOOP
         /* Go to the next idtag. */
         v_startloc := INSTR (genstr, idtag, 1, v_nthoccur);
         EXIT WHEN v_startloc = 0 OR genstr IS NULL;

         /* Get the identifier: between startloc and NEXT idtag. */
         v_endloc := INSTR (genstr, idtag, 1, v_nthoccur+1);

         IF v_endloc = 0
         THEN
            /* Error in syntax. Unmatching idtags. */
            PLGerr.raise (
               PLGerr.unmatched_idtags,
               'orig str ' || drvtext_str || CHR(10) ||
               'genstr ' || genstr);
            EXIT;
         ELSE
            v_orig_identifier :=
               PLGstr.betwn (v_lower_genstr, v_startloc, v_endloc, inclusive=>FALSE);

            /* Do a final alias substitution for the terminal string */
            v_alias_identifier :=
               LOWER (
                  PLGdoir.alias (
                     PLGgenv.genrec.driver,
                     PLGgenv.genrec.objname,
                     v_orig_identifier,
                     PLGgenv.genrec.schema
                  )
               );

            /* Get the original identifier alias. */
            v_orig_alias :=
               TRANSLATE (
                  PLGstr.betwn (drvtext_str, idtag, idtag, v_nthoccur, inclusive=>FALSE),
                  'A'||aliasopen||aliasclose, 'A');

            IF invalid_identifier (v_alias_identifier)
            THEN
               DECLARE
                  v_alias PLGadmin.dbmaxvc2 := fixed_identifier (v_alias_identifier);
                  v_alias_descrip PLG_doir.doc%TYPE;
               BEGIN
                  IF v_alias IS NOT NULL /* Already encountered this one. */
                  THEN
                     v_alias_identifier := v_alias;
                  ELSE
                     v_alias_descrip :=
                        PLGdoir.alias_descrip (
                           PLGgenv.genrec.driver,
                           PLGgenv.genrec.objname,
                           v_orig_alias,
                           PLGgenv.genrec.schema
                           );

                     /* 99.2 Don't get the abbreviation each time.
                     v_abbrev :=
                        PLGdoir.objabbrev (
                           PLGgenv.genrec.driver,
                           PLGgenv.genrec.objname,
                           PLGgenv.genrec.schema
                           );
                     */

                     /* Replace object name with abbreviation if it exists. */
                     IF PLGgenv.genrec.objabbrev IS NOT NULL
                     THEN
                        v_alias_identifier :=
                           REPLACE (
                              v_alias_identifier,
                              LOWER (PLGgenv.genrec.objname),
                              LOWER (PLGgenv.genrec.objabbrev));
                     END IF;

                     /* Perform a truncation of the string down to the max length allowed. */
                     v_alias_identifier := SUBSTR (v_alias_identifier, 1, g_ident_length);

                     /* If the resulting identifier is already in use,
                        modify with sequence number. */
                     WHILE PLGihash.inuse (v_alia

⌨️ 快捷键说明

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