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

📄 plgihash.spb

📁 Oracle PL/SQL procedure generator (second generator type)
💻 SPB
字号:
CREATE OR REPLACE PACKAGE BODY plgihash
IS
   c_maxrange CONSTANT PLS_INTEGER := POWER (2, 31) - 1;
   strt CONSTANT PLS_INTEGER := 2;
   g_maxrange    PLS_INTEGER := c_maxrange;
   
   TYPE hash_tabtype IS TABLE OF VARCHAR2(200)
      INDEX BY BINARY_INTEGER;
   
   hashtab hash_tabtype;
   
   probeby PLS_INTEGER := 3;
   
   FUNCTION hashval (str IN VARCHAR2)
      RETURN PLS_INTEGER
   IS
   BEGIN
      RETURN DBMS_UTILITY.GET_HASH_VALUE (
                str,
                strt,
                g_maxrange
             );
   END;

   PROCEDURE addname (ident IN VARCHAR2)
   IS
      end_search BOOLEAN := FALSE;
      v_ident PLGadmin.identifier := LOWER (ident);
      v_row PLS_INTEGER;
   BEGIN
      v_row := hashval (v_ident);
      
      /* Resolve hash conflict with linear probe method. */
      LOOP
         IF hashtab.exists (v_row)
         THEN
            /* If this row is in use and it is NOT the same string,
               move to the next row and try again. */
            IF hashtab (v_row) != v_ident
            THEN
               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) := v_ident;
            end_search := TRUE;
         END IF;
         
         EXIT WHEN end_search;
      END LOOP;
   END;
   
   PROCEDURE clear IS BEGIN hashtab.DELETE; END;
   
   FUNCTION inuse (ident IN VARCHAR2) RETURN BOOLEAN
   IS
      v_row  PLS_INTEGER := hashval (ident);
      retval BOOLEAN := FALSE;
   BEGIN
      LOOP
         IF hashtab.EXISTS (v_row)
         THEN
            /* If the string matches, we are done. */
            IF hashtab(v_row) = ident
            THEN
               retval := TRUE;
               EXIT;
            ELSE
               v_row := v_row + probeby;
            END IF;
         ELSE
            /* Name is not in use. */
            EXIT;
         END IF;
      END LOOP;
      
      RETURN retval;
   END;
   
   PROCEDURE showhash
   IS
      v_row PLS_INTEGER := hashtab.first;
   BEGIN
      LOOP
         EXIT WHEN v_row IS NULL;
         DBMS_OUTPUT.PUT_LINE (
              'Row ' ||
              v_row ||
              '-Identifier: ' ||
              hashtab(v_row));
         v_row := hashtab.next (v_row);
      END LOOP;
   END;
   
END;
/


⌨️ 快捷键说明

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