📄 plgihash.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 + -