У вас есть лишний BEGIN
в самом начале процедуры, а в последнем END
отсутствует точка с запятой.Вы не должны действительно использовать VARCHAR
, и вы все равно можете объявить переменную cName
, используя словарь данных;однако неявный цикл будет проще, как и использование оператора конкатенации ||
вместо вложенных вызовов CONCAT()
, и сгенерированный оператор не должен заканчиваться точкой с запятой:
create or replace procedure removeconstraintsfortable(p_table_name in varchar2) is
sql_stmt varchar2(2048);
begin
for rec in (
select owner, constraint_name
from all_constraints
where owner = sys_context('userenv','current_schema')
and table_name = p_table_name
and constraint_type = 'R'
)
loop
sql_stmt := 'ALTER TABLE "' || rec.owner || '"."' || p_table_name || '"'
|| ' DROP CONSTRAINT "' || rec.constraint_name || '"';
insert into temp(name) values(sql_stmt);
end loop;
commit;
end;
/
Как указано в комментарияхсгенерированный оператор должен быть drop constraint
.
Я не уверен, почему вы вставляете в таблицу или где вы выполняете оператор, но вы можете сделать все это в одном, если хотите:
create or replace procedure removeconstraintsfortable(p_table_name in varchar2) is
sql_stmt varchar2(2048);
begin
for rec in (
select owner, constraint_name
from all_constraints
where owner = sys_context('userenv','current_schema')
and table_name = p_table_name
and constraint_type = 'R'
)
loop
sql_stmt := 'ALTER TABLE "' || rec.owner || '"."' || p_table_name || '"'
|| ' DROP CONSTRAINT "' || rec.constraint_name || '"';
dbms_output.put_line(sql_stmt);
execute immediate sql_stmt;
end loop;
end;
/
Вызов dbms_output
просто показывает вам сгенерированные операторы до того, как execute immediate
выполнит его, ну, немедленно.
Quick demo;очень простая установка таблицы:
create table t42 (id number primary key);
create table t43 (id number references t42 (id));
select table_name, constraint_name, constraint_type
from all_constraints
where table_name in ('T42', 'T43');
TABLE_NAME CONSTRAINT_NAME C
------------------------------ ------------------------------ -
T43 SYS_C00138153 R
T42 SYS_C00138152 P
Затем вызовите процедуру, которая показывает сгенерированный оператор:
set serveroutput on
exec removeConstraintsForTable('T43');
ALTER TABLE "STACKOVERFLOW"."T43" DROP CONSTRAINT "SYS_C00138153"
PL/SQL procedure successfully completed.
, а затем проверьте, что ограничение прошло:
select table_name, constraint_name, constraint_type
from all_constraints
where table_name in ('T42', 'T43');
TABLE_NAME CONSTRAINT_NAME C
------------------------------ ------------------------------ -
T42 SYS_C00138152 P