Oracle '批量'禁用外來鍵的儲存過程
CREATE OR REPLACE PROCEDURE P_CONSTRAINT(V_TYPE VARCHAR2) IS
----------P_CONSTRAINT(外來鍵約束禁用、啟用 '適用於truncate table 報ORA-02266錯時用到')-------------
/*----------------------------------------------------------
| AUTHOR:毛海晴 |
| USERS :外來鍵約束禁用、啟用'清空資料時用到' |
| BLOG : http://blog.itpub.net/28602568/viewspace-1696583/|
-----------------------------------------------------------*/
/*
註釋:
由於在TRUNCATE表資料時有主外來鍵約束,所以要將外來鍵約束禁用。
判斷約束是否是外來鍵有2種:
1、USER_CONSTRAINTS檢視中約束型別CONSTRAINT_TYPE = 'R';
2、R_CONSTRAINT_NAME IS NOT NULL;
*/
P_SQL_ENABLE VARCHAR2(1000);
P_SQL_DISABLE VARCHAR2(1000);
P_TABLE_NAME VARCHAR2(1000);
P_CONSTRAINT_NAME VARCHAR2(1000);
/*
USER_CONSTRAINTS : 使用者的物件約束資訊
CONSTRAINT_TYPE:
P:主鍵;
R:外來鍵
C:非空約束/CHECK;
*/
--外來鍵STATUS非DISABLED的表/約束.
CURSOR C_CONS_DISABLE IS
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS C
WHERE C.CONSTRAINT_TYPE = 'R'
AND C.STATUS != 'DISABLED';
--外來鍵STATUS非ENABLED的表/約束.
CURSOR C_CONS_ENABLE IS
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS C
WHERE C.CONSTRAINT_TYPE = 'R'
AND C.STATUS != 'ENABLED';
BEGIN
---如果選擇‘禁用’則呼叫以下迴圈. 將所有查出狀態為ENABLED 改為DISABLED狀態
IF V_TYPE = '禁用' THEN
FOR P_C_CONS_DISABLE IN C_CONS_DISABLE LOOP
P_TABLE_NAME := P_C_CONS_DISABLE.TABLE_NAME;
P_CONSTRAINT_NAME := P_C_CONS_DISABLE.CONSTRAINT_NAME;
P_SQL_DISABLE := 'ALTER TABLE ' || P_TABLE_NAME ||
' DISABLE CONSTRAINT ' || P_CONSTRAINT_NAME || '';
--DBMS_OUTPUT.PUT_LINE(P_SQL_DISABLE);
EXECUTE IMMEDIATE P_SQL_DISABLE;
END LOOP;
END IF;
---如果選擇‘啟用’則呼叫以下迴圈.將所有查出狀態為DISABLED 改為ENABLED狀態
IF V_TYPE = '啟用' THEN
FOR P_C_CONS_ENABLE IN C_CONS_ENABLE LOOP
P_TABLE_NAME := P_C_CONS_ENABLE.TABLE_NAME;
P_CONSTRAINT_NAME := P_C_CONS_ENABLE.CONSTRAINT_NAME;
P_SQL_ENABLE := 'ALTER TABLE ' || P_TABLE_NAME ||
' ENABLE CONSTRAINT ' || P_CONSTRAINT_NAME || '';
--DBMS_OUTPUT.PUT_LINE(P_SQL_ENABLE);
EXECUTE IMMEDIATE P_SQL_ENABLE;
END LOOP;
END IF;
END P_CONSTRAINT;
*** 本文針對整個使用者進行全部禁用外來鍵,若有需要對錶做過濾,可在本部落格基礎上改寫..
【源於本人筆記】 若有書寫錯誤,表達錯誤,請指正...
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28602568/viewspace-1696583/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 從知乎瞭解到,為什麼Mysql禁用儲存過程、外來鍵和級聯?MySql儲存過程
- 批量插入資料的儲存過程儲存過程
- oracle的儲存過程Oracle儲存過程
- 從sybase的儲存過程轉向oracle的儲存過程儲存過程Oracle
- Oracle儲存過程Oracle儲存過程
- 儲存過程批量生成awr指令碼儲存過程指令碼
- oracle的儲存過程格式Oracle儲存過程
- SQL Server 禁用擴充套件儲存過程SQLServer套件儲存過程
- Oracle 通過儲存過程來生成CSV檔案Oracle儲存過程
- oracle批量生成日期字尾的表儲存過程程式碼Oracle儲存過程
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- Oracle儲存過程-1Oracle儲存過程
- Oracle儲存過程例子Oracle儲存過程
- Oracle建立儲存過程Oracle儲存過程
- oracle plsql儲存過程OracleSQL儲存過程
- ORACLE 儲存過程示例Oracle儲存過程
- 原創:oracle 儲存過程Oracle儲存過程
- oracle 儲存過程批次提交Oracle儲存過程
- oracle 儲存過程學習Oracle儲存過程
- [Flashback]Oracle flashback儲存過程Oracle儲存過程
- Oracle儲存過程學習Oracle儲存過程
- java 呼叫oracle 儲存過程JavaOracle儲存過程
- oracle--08儲存過程Oracle儲存過程
- ORACLE 禁用/啟用外來鍵和觸發器Oracle觸發器
- oracle儲存過程中的陣列Oracle儲存過程陣列
- mssql sqlserver 批量刪除所有儲存過程的方法分享SQLServer儲存過程
- ORACLE儲存過程中建立子過程的測試!Oracle儲存過程
- Oracle -- 批量更新sequence的儲存Oracle
- oracle儲存過程書寫格式Oracle儲存過程
- Oracle Pl/SQL 之 儲存過程OracleSQL儲存過程
- C#呼叫 oracle儲存過程C#Oracle儲存過程
- Oracle儲存過程基本語法Oracle儲存過程
- [Procedure]Oracle之分頁儲存過程Oracle儲存過程
- oracle 儲存過程遊標的使用Oracle儲存過程
- C#呼叫Oracle儲存過程C#Oracle儲存過程
- java中呼叫ORACLE儲存過程JavaOracle儲存過程
- 用java呼叫oracle儲存過程JavaOracle儲存過程
- Oracle 基礎 ----procedure(儲存過程)Oracle儲存過程