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

📄 plggen.tst

📁 Oracle PL/SQL procedure generator (second generator type)
💻 TST
📖 第 1 页 / 共 5 页
字号:
               END IF;

               IF v_srcrec.context = 'DEFAULT'
               THEN
                  /* Don't need to do complex substitution. */
                  v_srcrec.plsql_command :=
                     PLGdoir.func_call (
                        v_name,
                        PLGgenv.genrec.driver,
                        PLGgenv.genrec.objname,
                        PLGgenv.genrec.schema);
               ELSE
                  subst_string (
                     drv,
                     v_srcrec.plsql_command,
                     embed_in_quotes => TRUE,
                     sch => v_sch,
                     context_in => context_in);
               END IF;

               IF debugging
               THEN
                  pl ('Dynamic OIR execution of: ' || v_srcrec.plsql_command);
               END IF;

               IF PLGadmin.isvarchar2 (v_srcrec.returntype)
               THEN
                  PLGvar.assign (v_srcrec.plsql_command, retval, dyncur);
               ELSIF PLGadmin.isnumber (v_srcrec.returntype)
               THEN
                  PLGvar.assign (v_srcrec.plsql_command, v_number, dyncur);
                  retval := TO_CHAR (v_number);
               ELSIF PLGadmin.isboolean (v_srcrec.returntype)
               THEN
                  PLGvar.assign (v_srcrec.plsql_command, v_boolean, dyncur);
                  retval := PLGbool.stg (v_boolean, PLGdoir.c_truefalse);
               END IF;

               IF debugging
               THEN
                  pl ('generated a value of : ' || retval);
               END IF;
            END;

         ELSE /* Non PL/SQL object tag: look up in array or PLGgenv */

            IF v_qualifier IS NOT NULL
            THEN
               v_loc := genrec_ptr (v_qualifier);
            END IF;

            IF PLGdoir.iteration_specific_src (drv, v_srcrec)
            THEN
               IF v_qualifier IS NOT NULL
               THEN
                  retval := valbyname
                     ('PLGgen.genstate (' || TO_CHAR (v_loc) || ').' || v_name, dyncur);
               ELSE
                  retval := valbyname ('PLGgen.loopstate.' || v_name, dyncur);
               END IF;

            ELSIF PLGdoir.driver_wide_src (drv, v_srcrec)
            THEN
               IF v_qualifier IS NOT NULL
               THEN
                  retval := valbyname
                     ('PLGgen.genstate (' || TO_CHAR (v_loc) || ').' || v_name, dyncur);

               /* 99.2 Special case override of name with abbreviation */
               ELSIF PLGgenv.genrec.useobjabbrev AND
                     v_name = PLGdoir.c_objname
               THEN
                  retval := PLGgenv.genrec.objabbrev;

               /* 99.2 Avoid dynamic PL/SQL with known elements */
               ELSIF v_name = PLGdoir.c_objname
               THEN
                  retval := PLGgenv.genrec.objname;

               ELSE
                  retval := valbyname ('PLGgenv.genrec.' || v_name, dyncur);
               END IF;

            ELSIF PLGdoir.column_specific_src (PLGgenv.genrec.driver, 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 (LOWER (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 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
      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
      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 subst_string;

   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
      subst_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;
      staterec.statetype := v_statetype;

      /* Get command and main qualifier */
      staterec.statecommand :=
         PLGstr.betwn (text_in, objtagopen, objtagclose, inclusive=>FALSE);
      staterec.statevar :=
         NVL (bracketedval (text_in, objtagclose),
              SUBSTR (text_in, INSTR (text_in, objtagclose)+1));

      /* Extract other elements if present. */
      staterec.statelabel := bracketedval (text_in, vt_AS);
      staterec.astext := staterec.statelabel;
      staterec.betweentext := bracketedval (text_in, vt_BETWEEN);

      /* Special processing for arrays. */
      IF staterec.statetype = c_loopstate
      THEN
         /* Validate the array and retrieve names. */
         PLGdoir.validate_isarray (
            PLGgenv.genrec.driver,
            staterec.statevar,
            staterec.pkgname);

         /* Set the current array name */
         PLGgenv.genrec.arrayname := staterec.statevar;
      END IF;

      staterec.at_first_line := TRUE;

      IF debugging
      THEN
         pl ('STATEREC values command-var-pkg-label-between: ' ||
            staterec.statecommand || '-' ||
            staterec.statevar || '-' ||
            staterec.pkgname || '-' ||
            staterec.statelabel || '-' ||
            staterec.betweentext);
      END IF;

      v_start := bracketedval (text_in, vt_STARTROW);
      v_end := bracketedval (text_in, vt_ENDROW);

      IF debugging
      THEN
         pl ('STATEREC values start-end: ' ||
            staterec.startrow || '-' ||
            staterec.endrow);
      END IF;

      IF v_start IS NOT NULL
      THEN
         staterec.startend_override := TRUE;

         staterec.startrow :=
            strbyname (PLGgenv.genrec.driver,
               v_start, sch => PLGgenv.genrec.schema,
            context_in => curlooprow);

         staterec.endrow :=
            strbyname (PLGgenv.genrec.driver,
               v_end, sch => PLGgenv.genrec.schema,
            context_in => curlooprow);
      END IF;

      IF debugging
      THEN
         pl ('STATEREC values for ' || text_in ||
            'type-var-label-between-start-end: ' ||
            staterec.statecommand || '-' ||

⌨️ 快捷键说明

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