?? plgsrchash.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 + -