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

📄 plgdoir.spb

📁 Oracle PL/SQL procedure generator (second generator type)
💻 SPB
📖 第 1 页 / 共 5 页
字号:
      RETURN BOOLEAN
   IS
      rec       PLG_doir%ROWTYPE;
   BEGIN
      getcolrec (drv, tab, '%', c_hidden, 1, sch, FALSE, rec);
      RETURN rec.objid IS NOT NULL;
   END;

   FUNCTION ishidden (
      drv IN VARCHAR2,
      tab IN VARCHAR2,
      col IN VARCHAR2,
      sch IN VARCHAR2 := NULL
      )
      RETURN BOOLEAN
   IS
   BEGIN
      RETURN NVL (
                colval (drv, tab, col, c_hidden, 1, sch => sch) = c_true,
                FALSE
             );
   END;

   FUNCTION isupdcol (
      drv IN VARCHAR2,
      tab IN VARCHAR2,
      col IN VARCHAR2,
      sch IN VARCHAR2 := NULL
      )
      RETURN BOOLEAN
   IS
   BEGIN
      RETURN NVL (
                colval (drv, tab, col, c_updcol, 1, sch => sch) = c_true,
                FALSE
             );
   END;

   FUNCTION colfunc (
      drv IN VARCHAR2,
      tab IN VARCHAR2,
      col IN VARCHAR2,
      sch IN VARCHAR2 := NULL
      )
      RETURN PLG_doir.info%TYPE
   IS
   BEGIN
      RETURN colval (drv, tab, col, c_colfunc, 1, sch => sch);
   END;


   /* Driver foundation elements or not? */
   PROCEDURE drvfoundation
   IS
   BEGIN
      g_drvfoundation := TRUE;
   END;

   PROCEDURE nodrvfoundation
   IS
   BEGIN
      g_drvfoundation := FALSE;
   END;

   FUNCTION isdrvfoundation
      RETURN BOOLEAN
   IS
   BEGIN
      RETURN g_drvfoundation;
   END;

   /* Set information values */
   PROCEDURE ins (
      drv IN VARCHAR2,
      sch IN VARCHAR2,
      objname_in IN VARCHAR2,
      objtype_in IN VARCHAR2,
      attrname_in IN VARCHAR2,
      attrtype_in IN VARCHAR2,
      infotype_in IN PLG_doir.infotype%TYPE,
      seq_in IN PLG_doir.infoseq%TYPE,
      info_in IN PLG_doir.info%TYPE,
      uc_attrname IN BOOLEAN := TRUE,
      doc_in IN PLG_doir.doc%TYPE := '*IGNORE',
      upd_attrtype IN BOOLEAN := FALSE
      )
   IS
      v_driver  PLG_doir.driver%TYPE := UPPER (drv);
      v_owner   PLG_doir.owner%TYPE
         := UPPER (NVL (sch, g_schema));
      v_objname PLG_doir.objname%TYPE
         := UPPER (NVL (objname_in, c_global));
      v_objtype PLG_doir.objtype%TYPE
         := UPPER (objtype_in);
      v_attrname                    PLG_doir.attrname%TYPE
         := PLGadmin.ifelse (uc_attrname, UPPER (attrname_in), attrname_in);
      v_attrtype                    PLG_doir.attrtype%TYPE
         := UPPER (attrtype_in);
      v_infotype                    PLG_doir.infotype%TYPE
         := UPPER (infotype_in);
      v_infoseq PLG_doir.infoseq%TYPE := UPPER (seq_in);
      v_doc     PLG_doir.doc%TYPE
         := PLGadmin.ifelse (doc_in = '*IGNORE', NULL, doc_in);
      v_upd_attrtype                VARCHAR2(3)
         := PLGadmin.ifelse (upd_attrtype, c_true, c_false);
      v_objid   PLG_doir.objid%TYPE;

      CURSOR upd_cur
      IS
         SELECT objid
           FROM PLG_doir
          WHERE driver = v_driver
            AND owner = v_owner
            AND objname = v_objname
            AND objtype = v_objtype
            AND attrname = v_attrname
            AND  ( attrtype = v_attrtype
                OR v_upd_attrtype = c_true)
            AND infotype = v_infotype
            AND infoseq = v_infoseq
            FOR UPDATE NOWAIT
          ORDER BY objid desc;
   BEGIN
      /* Does the row already exist? */
      OPEN upd_cur;
      FETCH upd_cur INTO v_objid;

      IF v_objid > 0 AND NOT isdrvfoundation
         -- 99.2 Avoid writing over/UPDATE of user global settings.
      /*
          ((NOT isdrvfoundation AND v_objid > 0) OR
           (isdrvfoundation AND v_objid < 0))
      */
      THEN
         UPDATE PLG_doir
            SET info = info_in,
                doc = v_doc,
                attrtype = v_attrtype,
                changed_on = SYSDATE,
                changed_by = g_schema
          WHERE objid = v_objid;
      ELSIF    v_objid < 0
            OR v_objid IS NULL
            OR (v_objid > 0 AND isdrvfoundation)
      THEN

         /* Do an insert. If negative, that means we are creating an override
            on the global setting, so the only change will be the new POSITIVE sequence
            number. If driver-foundation is turned ON, then we will insert with a
            negative value. */
         IF     isdrvfoundation
            -- AND v_objid IS NULL
         THEN
            SELECT -1 * PLG_doir_seq.nextval
              INTO v_objid
              FROM dual;
         ELSE
            SELECT PLG_doir_seq.nextval
              INTO v_objid
              FROM dual;
         END IF;

         INSERT INTO PLG_doir (
             driver,
             objid,
             owner,
             objname,
             objtype,
             attrname,
             attrtype,
             infotype,
             infoseq,
             info,
             doc,
             created_on,
             created_by,
             changed_on,
             changed_by
          )
              VALUES (
                 v_driver,
                 v_objid,
                 v_owner,
                 v_objname,
                 v_objtype,
                 v_attrname,
                 v_attrtype,
                 v_infotype,
                 v_infoseq,
                 info_in,
                 v_doc,
                 SYSDATE,
                 g_schema,
                 SYSDATE,
                 g_schema
              );
      END IF;
   EXCEPTION
      WHEN OTHERS
      THEN
         IF SQLCODE = -54 /* Record locked in SELECT FOR UPDATE */
         THEN
            NULL; /* Just don't perform the update. */
         ELSE
	         PLGerr.raise (
	            PLGerr.insert_failure,
	            SQLERRM ||
	            '-' ||
	            v_driver ||
	            '-' ||
	            v_objid ||
	            '-' ||
	            v_owner ||
	            '-' ||
	            v_objname ||
	            '-' ||
	            v_objtype ||
	            '-' ||
	            v_attrname ||
	            '-' ||
	            v_attrtype ||
	            '-' ||
	            v_infotype ||
	            '-' ||
	            v_infoseq ||
	            '-' ||
	            info_in ||
	            '-' ||
	            v_doc
	         );
         END IF;
   END;

   PROCEDURE settabinfo (
      drv IN VARCHAR2,
      tab IN VARCHAR2,
      infotype_in IN PLG_doir.infotype%TYPE,
      info_in IN PLG_doir.info%TYPE,
      seq_in IN PLG_doir.infoseq%TYPE := 1,
      sch IN VARCHAR2 := NULL,
      verify_data IN BOOLEAN := FALSE,
      objtype_in IN VARCHAR2 := c_table,
      aname IN VARCHAR2 := NULL,
      atype IN VARCHAR2 := NULL
      )
   IS
      v_val     PLGadmin.identifier;
      v_info    PLG_doir.info%TYPE := info_in;
      v_num     PLS_INTEGER;
      perform_insert                BOOLEAN := TRUE;

      FUNCTION index_name (drv IN VARCHAR2, tab IN VARCHAR2, sch IN VARCHAR2)
         RETURN VARCHAR2
      IS
         retval    PLGadmin.identifier;
         indtab    PLGinds.ind_tabtype;
         coltab    PLGinds.indcol_tabtype;
         colrec    PLGinds.indcol_rectype;
         v_colmatch                    PLGadmin.identifier;
      BEGIN
         PLGinds.fortab (tab, indtab, coltab, sch, PLGinds.c_unique_nopky);


         /* If null, then get first unique index which is NOT
            the primary key. */
         IF     info_in IS NULL
            AND indtab.COUNT > 0
         THEN
            retval := indtab (indtab.first).index_name;
         ELSIF indtab.COUNT > 0
         THEN

            /* Is it an index? If not, check for matching first column. */
            v_info := UPPER (v_info);

            FOR rowind IN indtab.first .. indtab.last
            LOOP
               IF v_info = indtab (rowind).index_name
               THEN
                  retval := v_info;
                  EXIT;

               /* Bad boy! Unconditional exit! */
               ELSIF v_colmatch IS NULL

               /* Check for column match. */
               THEN
                  colrec := PLGinds.nthcol (coltab, rowind, 1);

                  IF v_info = colrec.column_name
                  THEN

 /* Don't use column name. Cannot identify later... */
 v_colmatch := indtab (rowind).index_name;

                  /* colrec.column_name; */
                  END IF;
               END IF;
            END LOOP;

            IF     retval IS NULL
               AND v_colmatch IS NOT NULL
            THEN
               retval := v_colmatch;
            END IF;
         END IF;

         RETURN retval;
      END;
   BEGIN
      PLGpriv.assert (tab, sch, PLGpriv.modobj);

      IF verify_data
      THEN
         IF infotype_in = c_sequence
         THEN
            OPEN seq_cur (schnn (sch), info_in);
            FETCH seq_cur INTO v_val;
            perform_insert := seq_cur%found;
            CLOSE seq_cur;
         ELSIF infotype_in = c_pkycol
         THEN
            OPEN col_cur (schnn (sch), tab, info_in);
            FETCH col_cur INTO v_val;
            perform_insert := col_cur%found;
            CLOSE col_cur;
         ELSIF infotype_in = c_pkydesc
         THEN
            v_info := index_name (drv, tab, sch);
            perform_insert := v_info IS NOT NULL;
         ELSIF     infotype_in = c_preload
               AND v_info IN (c_loadall, c_loadincr)
         THEN
            v_num := PLGpky.numcols (tab, sch);
            perform_insert := v_num = 1;

            IF NOT perform_insert
            THEN
               perform_insert :=     pkycol (drv, tab, 1, sch) IS NOT NULL
             AND pkycol (drv, tab, 2, sch) IS NULL;
            END IF;
         END IF;
      END IF;

      IF perform_insert
      THEN
         ins (
            drv,
            sch,
            tab,
            objtype_in,
            NVL (aname, c_global),
            NVL (atype, c_global),
            infotype_in,
            seq_in,
            v_info
         );
      END IF;
   END;

   PROCEDURE multitabset (
      drv IN VARCHAR2,
      tab IN VARCHAR2,
      const IN PLG_doir.infotype%TYPE,
      val IN PLG_doir.info%TYPE,
      pos IN PLG_doir.infoseq%TYPE := 1,
      sch IN VARCHAR2,
      ver IN BOOLEAN := FALSE,
      convert_val IN BOOLEAN := TRUE,
      remove_conflicts IN VARCHAR2 := NULL,
      objtype_in IN VARCHAR2 := c_table,
      aname IN VARCHAR2 := NULL,
      atype IN VARCHAR2 := NULL,
      remove_only IN BOOLEAN := FALSE
      )
   IS
      v_tab     PLGadmin.identifier := UPPER (tab);
      seglist   PLGiseg.seglist_rectype;

      PROCEDURE cleanup (tab IN VARCHAR2)
      IS
      BEGIN
         IF remove_conflicts IS NOT NULL
         THEN
            FOR itemind IN 1 .. PLGiseg.numitems (seglist)
            LOOP
               del (drv, tab, PLGiseg.item (seglist, itemind), sch => sch);
            END LOOP;
         END IF;
      END;
   BEGIN
      IF convert_val
      THEN
         v_tab := stdname (tab, val, TRUE);
      END IF;

      IF remove_conflicts IS NOT NULL
      THEN
         PLGiseg.loadstg (remove_conflicts, numsegs => 1, seglist => seglist);
      END IF;

      IF v_tab = c_global
      THEN
         ins (
            drv,
            sch,
            objname_in => c_global,
            objtype_in => c_table,
            attrname_in => c_global,
            attrtype_in => c_global,
            infotype_in => const,
            seq_in => 1,
            info_in => val
         );

      ELSIF    v_tab != UPPER (tab)
            OR INSTR (tab, '%') > 0
      THEN
         FOR rec IN tab_cur (tab, sch)
         LOOP
            cleanup (rec.object_name);

            IF NOT remove_only
            THEN
               settabinfo (
                  drv,
                  rec.object_name,
                  const,
                  PLGadmin.ifelse (
 convert_val,
 stdname (rec.object_name, val, FALSE),
 val
                  ),
                  pos,
                  rec.owner,
                  ver,
                  objtype_in => objtype_in,
                  aname => aname,
                  atype => atype
               );
            END IF;
         END LOOP;
      ELSE
         cleanup (tab);

         IF NOT remove_only
         THEN
            settabinfo (
               drv,
               tab,
               const,
               PLGadmin.ifelse (convert_val, UPPER (val), val),
               pos,
               sch => sch,
               verify_data => ver,
               aname => aname,
               atype => atype
            );
         END IF;
      END IF;
   END;

   PROCEDURE reggen (
      drv IN VARCHAR2,
      tab IN VARCHAR2,
      sch IN VARCHAR2,
      target_schema IN VARCHAR2 := NULL
      )
   IS
   BEGIN
      ins (
         drv,
         sch => sch,
         objname_in => tab,
         objtype_in => c_reggen,
         attrname_in => drv,
         attrtype_in => c_global,
         infotype_in => c_global,
         seq_in => 1,
         info_in => target_schema
      );
   END;

   PROCEDURE setappprefix (
      drv IN VARCHAR2,
      tab IN VARCHAR2,
      str IN VARCHAR2,
      sch IN VARCHAR2 := NULL
      )
   IS
   BEGIN
      multitabset (
         drv,
         tab,
         c_appprefix,
         str,
         1,
         sch,
         TRUE,
         convert_val => FALSE
      );
   END;

   PROCEDURE setdescindex (
      drv IN VARCHAR2,
      tab IN VARCHAR2,
      unique_index IN VARCHAR2 := NULL,
      indexfunc IN VARCHAR2 := NULL,
      func_datatype IN VARCHAR2 := 'VARCHAR2',
      sch IN VARCHAR2 := NULL
      )

   /* Unique_index argument can be name of unique index or name of leading column.
      IF NULL, then uses the first unique index which is NOT the PK. */
   IS
   BEGIN
      multitabset (
         drv,
         tab,

⌨️ 快捷键说明

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