首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用存储过程禁用/启用Oracle表中的约束,其中表名是参数化的

使用存储过程禁用/启用Oracle表中的约束,其中表名是参数化的
EN

Stack Overflow用户
提问于 2020-06-26 18:30:53
回答 1查看 173关注 0票数 0

我想创建一个可重用的存储过程,当表作为参数传递时,它可以禁用表中的约束。我创建了一个表名为hard coded.Could的存储过程,请帮助

代码语言:javascript
代码运行次数:0
运行
复制
Create or Replace Procedure Disable_Constraints
as Begin  
Declare 
V_OWNER VARCHAR2(30);  
V_TABLE_NAME VARCHAR2(30);  
V_CONSTRAINT_NAME VARCHAR2(30);  
CURSOR C IS   
select OWNER,TABLE_NAME,CONSTRAINT_NAME  
from all_constraints  
where table_name='EMP_CONSTRAINTS';  
BEGIN  
OPEN C;  
LOOP  
FETCH C INTO V_OWNER,V_TABLE_NAME,V_CONSTRAINT_NAME;  
EXIT WHEN C%NOTFOUND;  
dbms_utility.exec_ddl_statement ('alter table ' || V_OWNER || '.' || V_TABLE_NAME || ' disable constraint ' || V_CONSTRAINT_NAME);  
END LOOP;  
CLOSE C;  
END;  
END DISABLE_CONSTRAINTS;  

谢谢,Khader

EN

回答 1

Stack Overflow用户

发布于 2020-06-26 18:39:18

例如:

示例表:

代码语言:javascript
代码运行次数:0
运行
复制
SQL> CREATE TABLE test
  2  (
  3     id    NUMBER CONSTRAINT pkt PRIMARY KEY,
  4     name  VARCHAR2 (20) CONSTRAINT cht CHECK (name LIKE 'A%')
  5  );

Table created.

操作步骤:

代码语言:javascript
代码运行次数:0
运行
复制
SQL> CREATE OR REPLACE PROCEDURE p_disc (par_table_name IN VARCHAR2)
  2  IS
  3  BEGIN
  4     FOR cur_r
  5        IN (SELECT constraint_name
  6              FROM user_constraints
  7             WHERE UPPER (table_name) =
  8                      UPPER (DBMS_ASSERT.sql_object_name (par_table_name)))
  9     LOOP
 10        EXECUTE IMMEDIATE
 11              'alter table '
 12           || DBMS_ASSERT.sql_object_name (par_table_name)
 13           || ' disable constraint '
 14           || cur_r.constraint_name;
 15     END LOOP;
 16  END;
 17  /

Procedure created.

测试:

代码语言:javascript
代码运行次数:0
运行
复制
SQL> SELECT constraint_name, status FROM user_constraints WHERE table_name = 'TEST';

CONSTRAINT_NAME                STATUS
------------------------------ --------
CHT                            ENABLED
PKT                            ENABLED

SQL> EXEC p_disc('test');

PL/SQL procedure successfully completed.

SQL> SELECT constraint_name, status FROM user_constraints WHERE table_name = 'TEST';

CONSTRAINT_NAME                STATUS
------------------------------ --------
CHT                            DISABLED
PKT                            DISABLED

SQL>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62592834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档