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

📄 plgsrchash.spb

📁 Oracle PL/SQL procedure generator (second generator type)
💻 SPB
字号:
CREATE OR REPLACE PACKAGE BODY plgsrchash
IS
   /* Cached data */

   TYPE src_rectype_array_type IS TABLE OF PLGdoir.src_rectype
      INDEX BY BINARY_INTEGER;

   rec_array src_rectype_array_type;

   /* Hashing structures */

   c_maxrange CONSTANT PLS_INTEGER := POWER (2, 31) - 1;
   strt CONSTANT PLS_INTEGER := 2;
   g_maxrange    PLS_INTEGER := c_maxrange;

   TYPE hash_rectype IS RECORD (
      str VARCHAR2(2000),
      key PLS_INTEGER,
      driver VARCHAR2 (100),
      srcstring VARCHAR2 (200),
      srctype VARCHAR2 (100),
      plsql_command VARCHAR2 (1000),
      returntype VARCHAR2 (100),
      objid NUMBER,
      context VARCHAR2 (200)
   );

   TYPE hash_tabtype IS TABLE OF hash_rectype
      INDEX BY BINARY_INTEGER;
   hashtab hash_tabtype;
   probeby PLS_INTEGER := 3;
   g_trc   BOOLEAN := FALSE;

/* Consistent hashing ensured... */

   FUNCTION hashval (str IN VARCHAR2) RETURN PLS_INTEGER
   IS
   BEGIN
      RETURN DBMS_UTILITY.get_hash_value (
                str,
                strt,
                g_maxrange
             );
   END;

   PROCEDURE add_to_altind (
      str_in IN VARCHAR2,
      key_in IN PLS_INTEGER
      )
   IS
      end_search BOOLEAN := FALSE;
      v_row  PLS_INTEGER := hashval (str_in);
   BEGIN
      /* Resolve hash conflict with linear probe method. */
      LOOP
         IF hashtab.exists (v_row)
         THEN
            IF hashtab (v_row).str != str_in
            THEN
               /* Dallas: what about going past the max row? */
               v_row := v_row + probeby;
            ELSE
               /* Same string, same row. No action necessary. */
               end_search := TRUE;
            END IF;
         ELSE
            /* Insert a new row in the hash table. */
            hashtab (v_row).str := str_in;
            hashtab (v_row).key := key_in;
            end_search := TRUE;
         END IF;

         EXIT WHEN end_search;
      END LOOP;
   END;

   FUNCTION keyval (str_in IN VARCHAR2) RETURN PLS_INTEGER
   IS
      end_search BOOLEAN := FALSE;
      retval     PLS_INTEGER := hashval (str_in);
   BEGIN
      LOOP
         IF hashtab.exists (retval)
         THEN
            /* If the string matches, we are done. */
            IF hashtab (retval).str = str_in
            THEN
               retval := hashtab (retval).key;
               end_search := TRUE;
            ELSE
               /* Try the next row. */
               retval := retval + probeby;
            END IF;
         ELSE
            retval := NULL;
            end_search := TRUE;
         END IF;

         EXIT WHEN end_search;
      END LOOP;

      RETURN retval;
   END;

   FUNCTION onerow (
      drv_in IN VARCHAR2, srcstring_in IN VARCHAR2
      )
      RETURN PLGdoir.src_rectype
   IS
      v_row PLS_INTEGER;
      retval PLGdoir.src_rectype; 
   BEGIN
      v_row := keyval (drv_in || '|' || srcstring_in);

      IF v_row IS NOT NULL
      THEN
         retval := rec_array (v_row);
      ELSE
         /* 07/16/99 Cannot RETURN NULL; in 7.3. */
         /* Just return the default/NULL record. */
         NULL;
      END IF;
      
      RETURN retval;
   END;

   PROCEDURE addrow (
      drv_in IN VARCHAR2, srcstring_in IN VARCHAR2,
      driver IN VARCHAR2,
      srcstring IN VARCHAR2,
      srctype IN VARCHAR2,
      plsql_command IN VARCHAR2,
      returntype IN VARCHAR2,
      objid IN NUMBER,
      context IN VARCHAR2
      )
   IS
   BEGIN
      add_to_altind (drv_in || '|' || srcstring_in, addrow.objid);

      rec_array(addrow.objid).driver := addrow.driver;
      rec_array(addrow.objid).srcstring := addrow.srcstring;
      rec_array(addrow.objid).srctype := addrow.srctype;
      rec_array(addrow.objid).plsql_command := addrow.plsql_command;
      rec_array(addrow.objid).returntype := addrow.returntype;
      rec_array(addrow.objid).objid := addrow.objid;
      rec_array(addrow.objid).context := addrow.context;
   END;
   
   PROCEDURE addrow (
      drv_in IN VARCHAR2, srcstring_in IN VARCHAR2,
      rec IN PLGdoir.src_rectype
      )
   IS
   BEGIN
      add_to_altind (drv_in || '|' || srcstring_in, rec.objid);
      rec_array(rec.objid) := rec;
   END;

   PROCEDURE delete IS BEGIN rec_array.DELETE; hashtab.DELETE; END;
   
END;
/

⌨️ 快捷键说明

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