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

📄 plggen.spb

📁 Oracle PL/SQL procedure generator (second generator type)
💻 SPB
📖 第 1 页 / 共 5 页
字号:
                     drv,
                     v_srcrec
                  )
            THEN
               /*
               label --> location in stack --> row# and statevar --> colname
               nolabel -->   row# and statevar --> colname
               */
               IF v_qualifier IS NULL
               THEN
                  /*-- 1/99 OLD v_loc := loopstate.currrow; */
                  v_coltype := loopstate.statevar;

                  IF v_coltype IS NOT NULL
                  THEN
                     v_loc :=   loopstart (loopstate)
                              + loopstate.nthrow
                              - 1;
                  END IF;
               ELSE
                  v_coltype :=
                           PLGgen.genstate (v_loc).statevar;
                  v_loc := PLGgen.genstate (v_loc).currrow;
               END IF;

               PLGerr.assert (
                  v_coltype IS NOT NULL,
                     'Invalid use of column-specific tag "'
                  || v_name
                  || '". Confirm [FOREACH] context.',
                  PLGerr.undefined_objtag
               );

               IF indirect_loop (v_coltype)
               THEN
                  retval := valbyname (
                                  loopstate.pkgname
                               || '.'
                               || v_coltype
                               || '('
                               || TO_CHAR (v_loc)
                               || ').column_name',
                               dyncur
                            );
                  v_loc := gencol_row (retval);
               ELSIF redirect_loop (v_coltype)
               THEN
                  /* Get location from contents of array. */
                  PLGvar.assign (
                        loopstate.pkgname
                     || '.'
                     || v_coltype
                     || '('
                     || TO_CHAR (v_loc)
                     || ')',
                     v_loc,
                     dyncur
                  );
               ELSIF v_coltype = c_col
               THEN
                  /* All set, I think! */
                  NULL;
               END IF;

               retval := valbyname (
                               'PLGgen.gencol('
                            || TO_CHAR (v_loc)
                            || ').'
                            || v_name,
                            dyncur
                         );
            END IF;
         END IF;
      END IF;

      --tmr_end;
      RETURN retval;
   EXCEPTION
      WHEN null_name
      THEN
         RETURN retval;
      WHEN plsql_compile_error
      THEN
         PLGerr.RAISE (
            PLGerr.undefined_objtag,
               'Undefined or unmatched object tag : '
            || name_in
         );
      WHEN OTHERS
      THEN
         PLGerr.RAISE (
               'Error ORA-'
            || SQLCODE
            || ' translating '
            || name_in
         );
   END strbyname;

   PROCEDURE substitute_string (
      drv                IN       VARCHAR2,
      str                IN OUT   VARCHAR2,
      embed_in_quotes    IN       BOOLEAN := FALSE,
      subst_db_tags      IN       BOOLEAN := TRUE,
      subst_db_open      IN       VARCHAR2 := NULL,
      subst_db_close     IN       VARCHAR2 := NULL,
      use_tag_example    IN       BOOLEAN := FALSE,
      sch                IN       VARCHAR2 := NULL,
      context_in         IN       VARCHAR2 := NULL,
      expandalias_only   IN       BOOLEAN := FALSE
   )
   IS
      v_iterations   PLS_INTEGER := 1;
      v_loc          PLS_INTEGER;
      v_loc1         PLS_INTEGER;

      PROCEDURE subst_tagged_elements (
         op              IN   VARCHAR2,
         cl              IN   VARCHAR2,
         justonce        IN   BOOLEAN := FALSE,
         noncontigopen   IN   VARCHAR2 := NULL
      )
      IS
         v_end         PLS_INTEGER;
         v_orig_word   PLGadmin.dbmaxvc2;
         v_word        PLGadmin.dbmaxvc2;
         v_start       PLS_INTEGER       := 1;
         v_embed       BOOLEAN           := embed_in_quotes;

         FUNCTION nextword (str IN VARCHAR2)
            RETURN VARCHAR2
         IS
            nothing_found   BOOLEAN        := TRUE;
            v_loc           BINARY_INTEGER;
         BEGIN
            v_loc := INSTR (str, op, 1);

            IF v_loc > 0
            THEN
               nothing_found := noncontigopen IS NOT NULL;

               IF nothing_found
               THEN
                  nothing_found := SUBSTR (
                                      str,
                                        v_loc
                                      + 1,
                                      1
                                   ) = noncontigopen;
               END IF;
            END IF;

            IF nothing_found
            THEN
               RETURN NULL;
            ELSE
               RETURN PLGstr.betwn (
                         SUBSTR (str, v_loc),
                         op,
                         cl
                      );
            END IF;
         END;
      BEGIN
         LOOP
            v_orig_word := nextword (str);
            EXIT WHEN v_orig_word IS NULL;

            IF      NOT subst_db_tags
                AND op = objtagopen
            THEN
               DECLARE
                  do_translate   BOOLEAN := TRUE;
               BEGIN
                  IF use_tag_example
                  THEN
                     /* Replace tag with example text */
                     v_word :=
                        PLGdoir.tag_example (
                           drv,
                           v_orig_word,
                           objtagopen,
                           objtagclose
                        );

                     IF v_word IS NOT NULL
                     THEN
                        str := REPLACE (
                                  str,
                                  v_orig_word,
                                  v_word
                               );
                        do_translate := FALSE;
                     END IF;
                  END IF;

                  IF do_translate
                  THEN
                     /* If not substituting DB tags, then replace them with
                        substitution characters. */
                     str := TRANSLATE (
                               str,
                                  objtagopen
                               || objtagclose,
                                  subst_db_open
                               || subst_db_close
                            );
                  END IF;
               END;
            ELSE
               /* Perform the dynamic substitutions. */
               IF    v_orig_word LIKE    op
                                      || c_asis_wild
                  OR v_orig_word LIKE c_asis_wild
               THEN
                  v_embed := FALSE;
                  v_word := TRANSLATE (
                               v_orig_word,
                               c_asis_translate,
                               c_translate
                            );
               ELSE
                  v_embed := embed_in_quotes;
                  v_word := v_orig_word;
               END IF;

               v_word := strbyname (
                            drv,
                            v_word,
                            op,
                            cl,
                            sch   => sch,
                            context_in=> context_in
                         );

               IF v_embed
               THEN
                  v_word :=    ''''
                            || v_word
                            || '''';
               END IF;

               str := REPLACE (str, v_orig_word, v_word);
            END IF;

            /* Trap for infinite loop */
            IF v_iterations > maxiterations
            THEN
               PLGerr.RAISE (
                  PLGerr.too_many_iterations,
                     'Unmatched object or alias tags in '
                  || str
               );
               RAISE DUP_VAL_ON_INDEX;
            ELSE
               v_iterations :=   v_iterations
                               + 1;
            END IF;

            EXIT WHEN justonce;
         END LOOP;

         /* Get rid of double brackets if present. */
         str := REPLACE (str,    op
                              || op, op);
         str := REPLACE (str,    cl
                              || cl, cl);
      END;
   BEGIN
      IF g_asis
      THEN
         -- No substitutions
         NULL;
      ELSE
         LOOP
            v_loc := INSTR (str, objtagopen);
            v_loc1 := INSTR (str, aliasopen);
            /* I dare you, Steven, to explain this one! */
            EXIT WHEN (   str IS NULL
                       OR v_loc IS NULL
                       OR v_loc1 IS NULL
                      )
                   OR (    subst_db_tags
                       AND v_loc = 0
                       AND v_loc1 = 0
                      )
                   OR (    NOT subst_db_tags
                       AND v_loc1 = 0
                       AND (   v_loc = 0
                            OR (    v_loc > 0
                                AND NOT use_tag_example
                               )
                           )
                      );
            subst_tagged_elements (
               aliasopen,
               aliasclose,
               justonce=> TRUE,
               noncontigopen=> objtagopen
            );           /* checks for cases like {[abc]} */
            subst_tagged_elements (objtagopen, objtagclose);

            /* Trap for infinite loop */
            IF v_iterations > maxiterations
            THEN
               PLGerr.RAISE (
                  PLGerr.too_many_iterations,
                     'Unmatched object or alias tags in '
                  || str
               );
               RAISE DUP_VAL_ON_INDEX;
            ELSE
               v_iterations :=   v_iterations
                               + 1;
            END IF;
         END LOOP;

         IF NOT subst_db_tags
         THEN
            str := TRANSLATE (
                      str,
                         subst_db_open
                      || subst_db_close,
                         objtagopen
                      || objtagclose
                   );
         END IF;

         /* Strip out any PLG alias prefixes that may still be around. */
         str := REPLACE (str, PLGdoir.PLGalias, NULL);
      END IF;
   END substitute_string;

   FUNCTION substitute_string (
      drv               IN   VARCHAR2,
      str               IN   VARCHAR2,
      embed_in_quotes   IN   BOOLEAN := FALSE,
      subst_db_tags     IN   BOOLEAN := TRUE,
      subst_db_open     IN   VARCHAR2 := NULL,
      subst_db_close    IN   VARCHAR2 := NULL,
      use_tag_example   IN   BOOLEAN := FALSE,
      sch               IN   VARCHAR2 := NULL,
      context_in        IN   VARCHAR2 := NULL
   )
      RETURN VARCHAR2
   IS
      retval   PLGadmin.dbmaxvc2 := str;
   BEGIN
      substitute_string (
         drv,
         retval,
         embed_in_quotes,
         subst_db_tags,
         subst_db_open,
         subst_db_close,
         use_tag_example,
         sch,
         context_in
      );
      RETURN retval;
   END;

   PROCEDURE subst_string (
      drv                IN       VARCHAR2,
      str                IN OUT   VARCHAR2,
      embed_in_quotes    IN       BOOLEAN := FALSE,
      subst_db_tags      IN       BOOLEAN := TRUE,
      subst_db_open      IN       VARCHAR2 := NULL,
      subst_db_close     IN       VARCHAR2 := NULL,
      use_tag_example    IN       BOOLEAN := FALSE,
      sch                IN       VARCHAR2 := NULL,
      context_in         IN       VARCHAR2 := NULL,
      expandalias_only   IN       BOOLEAN := FALSE
   )
   IS
   BEGIN
      substitute_string (
         drv,
         str,
         embed_in_quotes,
         subst_db_tags,
         subst_db_open,
         subst_db_close,
         use_tag_example,
         sch,
         context_in,
         expandalias_only
      );
   END;

   FUNCTION subst_string (
      drv               IN   VARCHAR2,
      str               IN   VARCHAR2,
      embed_in_quotes   IN   BOOLEAN := FALSE,
      subst_db_tags     IN   BOOLEAN := TRUE,
      subst_db_open     IN   VARCHAR2 := NULL,
      subst_db_close    IN   VARCHAR2 := NULL,
      use_tag_example   IN   BOOLEAN := FALSE,
      sch               IN   VARCHAR2 := NULL,
      context_in        IN   VARCHAR2 := NULL
   )
      RETURN VARCHAR2
   IS
      retval   PLGadmin.dbmaxvc2 := str;
   BEGIN
      substitute_string (
         drv,
         retval,
         embed_in_quotes,
         subst_db_tags,
         subst_db_open,
         subst_db_close,
         use_tag_example,
         sch,
         context_in
      );
      RETURN retval;
   END;

   PROCEDURE setstate (
      staterec   IN OUT   state_stk_type,
      text_in    IN       VARCHAR2
   )
   IS
      v_start       PLGadmin.identifier;
      v_end         PLGadmin.identifier;
      v_statetype   PLS_INTEGER         := staterec.statetype;
   BEGIN
      IF debugging
      THEN
         pl (
               'setstate for '
            || text_in
            || ' with type '
            || staterec.statetype
         );
      END IF;

      staterec := empty_staterec;
      statere

⌨️ 快捷键说明

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