一些ORACLE腳本

基本都是網上摘錄來的,可能有自己的整理,謝謝作者
[color=red]----------------------------------------------------------------SEPARATE-LINE----------------------------------------------------------------[/color]

強制刪除Oracle當前用戶
SELECT 'alter system kill session '''||sid||','||serial#||''';' FROM v$session WHERE username='USER';


這樣得到腳本,然後保存成文件執行,然後再drop user ....

[quote]模仿Java中String類的endsWith方法[/quote]
CREATE OR REPLACE FUNCTION F_ENDSWITH(SRC    IN VARCHAR2,
SUFFIX IN VARCHAR2 DEFAULT '00')
RETURN BOOLEAN IS
RESULT BOOLEAN;
N_SUFFIX_COUNT NUMBER;
N_SRC_COUNT NUMBER;
V_STR_TMP VARCHAR2(200);
BEGIN
N_SUFFIX_COUNT := LENGTH(SUFFIX);
N_SRC_COUNT := LENGTH(SRC);
V_STR_TMP := SUBSTR(SRC,
N_SRC_COUNT - N_SUFFIX_COUNT + 1,
N_SUFFIX_COUNT);

IF (V_STR_TMP = SUFFIX) THEN
RESULT := TRUE;
ELSE
RESULT := FALSE;
END IF;
RETURN(RESULT);
END F_ENDSWITH;


[quote]模仿Java中String類的startsWith方法[/quote]
CREATE OR REPLACE FUNCTION F_STARTSWITH(SRC    IN VARCHAR2,
PREFIX IN VARCHAR2) RETURN BOOLEAN IS
RESULT BOOLEAN;
N_PREFIX_COUNT NUMBER;
V_STR_TMP VARCHAR2(200);
BEGIN
N_PREFIX_COUNT := LENGTH(PREFIX);
V_STR_TMP := SUBSTR(SRC, 0, N_PREFIX_COUNT);

IF (V_STR_TMP = PREFIX) THEN
RESULT := TRUE;
ELSE
RESULT := FALSE;
END IF;
RETURN(RESULT);
END F_STARTSWITH;


[quote]校驗傳入的字符串是否爲合法的日期表示,或者能否轉化爲日期,還有待完善[/quote]
CREATE OR REPLACE FUNCTION F_ISDATE(YYYYMMDD IN VARCHAR2,
FORMAT IN VARCHAR2 DEFAULT 'yyyymmdd')
RETURN BOOLEAN IS
FLAG BOOLEAN DEFAULT FALSE;
TMP_DATE VARCHAR2(10);
YYYY INT;
MM INT;
DD INT;
BEGIN
BEGIN
TMP_DATE := TRIM(YYYYMMDD);
YYYY := TO_NUMBER(SUBSTR(TMP_DATE, 1, 4));
MM := TO_NUMBER(SUBSTR(TMP_DATE, 5, 2));
DD := TO_NUMBER(SUBSTR(TMP_DATE, 7, 2));

IF (MM >= 1 AND MM <= 12 AND DD >= 1 AND DD <= 31) THEN
IF (MM = 4 OR MM = 6 OR MM = 9 OR MM = 11) THEN
IF (DD <= 30) THEN
FLAG := TRUE;
END IF;
ELSIF (MM = 2) THEN
IF (MOD(YYYY, 100) <> 0 AND MOD(YYYY, 4) = 0 OR MOD(YYYY, 400) = 0) THEN
IF (DD <= 29) THEN
FLAG := TRUE;
END IF;
ELSIF (DD <= 28) THEN
FLAG := TRUE;
END IF;
ELSE
FLAG := TRUE;
END IF;
END IF;

EXCEPTION
WHEN OTHERS THEN
FLAG := FALSE;
END;
RETURN(FLAG);
END F_ISDATE;


[quote]校驗傳入的字符串是否爲合法的身份證號碼,包括15位和18位,還有待完善[/quote]
'T'表示是符合校驗規則身份證,'F'表示錯誤的號碼,'NR'表示是不符合18位校驗規則的
CREATE OR REPLACE FUNCTION F_ISIDCARD(AAC002       IN VARCHAR2, -- 傳入的號碼
VALIDATOR_ON IN NUMBER DEFAULT 0) -- 是否開啓18位校驗器
RETURN VARCHAR2 IS
RESULT VARCHAR2(2);

TYPE W IS VARRAY(18) OF INTEGER;
TYPE A IS VARRAY(11) OF VARCHAR2(1);

NUM_LEN INT;
DOB VARCHAR2(8);
F17 VARCHAR2(17);
I18 VARCHAR2(18);

RW W;
RA A;

NUM_SUM INTEGER DEFAULT 0;

BEGIN

NUM_LEN := LENGTH(AAC002);
IF (NUM_LEN = 15 OR NUM_LEN = 18) THEN

RW := W(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
RA := A('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');

IF NUM_LEN = 15 THEN
F17 := SUBSTR(AAC002, 1, 6) || '19' || SUBSTR(AAC002, 7, 9);
ELSE
F17 := SUBSTR(AAC002, 1, 17);
END IF;

DOB := SUBSTR(F17, 7, 8);

IF F_ISDATE(DOB) AND VALIDATOR_ON = 0 THEN
-- 如果出生日期正確,而且不進行18位校驗
RESULT := 'T';
ELSIF F_ISDATE(DOB) AND VALIDATOR_ON = 1 THEN
-- 如果出生日期正確,而且進行18位校驗
FOR I IN 1 .. 17 LOOP
NUM_SUM := NUM_SUM + TO_NUMBER(SUBSTR(F17, I, 1)) * RW(I);
END LOOP;
I18 := F17 || RA(MOD(NUM_SUM, 11) + 1);
IF NUM_LEN = 18 AND UPPER(AAC002) = I18 THEN
RESULT := 'T';
ELSE
RESULT := 'NR';
END IF;
ELSE
RESULT := 'F';
END IF;
ELSE
RESULT := 'F';
END IF;
RETURN(RESULT);
END F_ISIDCARD;


[quote]查看oracle中鎖住的對象,並殺之[/quote]
SELECT B.SID,
B.MACHINE,
C.OBJECT_NAME,
A.ORACLE_USERNAME,
A.LOCKED_MODE,
B.OSUSER,
'alter system kill session ''' || B.SID || ',' || B.SERIAL# || ''';'
FROM V$LOCKED_OBJECT A, V$SESSION B, ALL_OBJECTS C
WHERE A.SESSION_ID = B.SID
AND A.OBJECT_ID = C.OBJECT_ID;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章