Oracle数据库如何不使用存储过程直接执行SELECT返回的SQL语句
实现方案
你原来写的SQL生成逻辑有语法问题:拼出来的ALTER TABLE语句漏了要操作的表名,输出的ALTER TABLE drop CONSTRAINT PRINCIPAL_ID_FKEY ;本身就跑不通,正确的ALTER TABLE语法必须在关键字后指定表名。
Oracle里如果不用DECLARE...BEGIN...END这类PL/SQL块,也不建持久化的存储过程、函数对象,可以用DBMS_XMLGEN的执行能力,写单条SELECT语句直接生成并执行目标DDL,代码如下:
SELECT XMLType(DBMS_XMLGEN.GETXML( 'ALTER TABLE PRINCIPALS_ROLES DROP CONSTRAINT ' || constraint_name )) AS exec_result FROM user_constraints WHERE constraint_type = 'R' AND table_name = 'PRINCIPALS_ROLES' AND r_constraint_name = ( SELECT constraint_name FROM user_constraints WHERE table_name = 'PRINCIPALS' AND constraint_type= 'P' );
注意事项
- 整条语句是纯SELECT结构,没有PL/SQL块,执行时会自动查找到符合条件的外键,拼接成正确的删约束语句直接运行
- 拼接DDL的时候去掉了原逻辑里多余的结尾分号,
DBMS_XMLGEN执行单条语句不需要额外加分号 - 如果查询匹配到多个符合条件的外键,这条语句会把所有匹配到的外键都删掉
- 执行账号需要直接拥有
PRINCIPALS_ROLES表的ALTER权限,权限不能是通过角色授予的,否则会报权限不足 - 正式执行前可以先跑下面的查询确认生成的DDL符合预期,避免误删:
SELECT 'ALTER TABLE PRINCIPALS_ROLES DROP CONSTRAINT ' || constraint_name AS to_exec_ddl FROM user_constraints WHERE constraint_type = 'R' AND table_name = 'PRINCIPALS_ROLES' AND r_constraint_name = ( SELECT constraint_name FROM user_constraints WHERE table_name = 'PRINCIPALS' AND constraint_type= 'P' );
内容的提问来源于stack exchange,提问作者shashank
相关产品推荐
相关产品推荐

