如果我的第一个查询的输出为“ 0”,我如何自动执行后三个查询?
我的查询如下:
1 。首先查询哪个输出应为“ 0”:
select pages from feature_control;
2 。如果以上查询的输出为“ 0”,则自动执行以下三个查询 查询:
alter trigger feature_control disable;
alter trigger rep_feature_control disable;
update feature_control set pages = '0';
答案 0 :(得分:0)
您可以使用execute immediate '...'
包装DDL语句:
declare
v_pages feature_control.pages%type;
begin
begin
select pages into v_pages from feature_control;
exception when no_data_found then pages='-1'; --just a presumed value other than null or zero.
end;
if v_pages = '0' then
execute immediate 'alter trigger feature_control disable';
execute immediate 'alter trigger rep_feature_control disable';
update feature_control set pages = v_pages;
commit;
end if;
end;
/
答案 1 :(得分:0)
无法“自动”完成“自动”,但是(存储或匿名PL / SQL)过程可能会有所帮助。就是这样。
先设置:
SQL> create table feature_control (pages varchar2(1));
Table created.
SQL> create or replace trigger feature_control
2 before insert on feature_control
3 for each row
4 begin
5 null;
6 end;
7 /
Trigger created.
SQL> create or replace trigger rep_feature_control
2 before insert on feature_control
3 for each row
4 begin
5 null;
6 end;
7 /
Trigger created.
SQL> insert into feature_control(pages) values ('0');
1 row created.
现在,使用动态SQL-由于无法直接执行DDL,请执行以下操作:
SQL> declare
2 l_pages feature_control.pages%type;
3 begin
4 select pages into l_pages
5 from feature_control;
6
7 if l_pages = '0' then
8 execute immediate 'alter trigger feature_control disable';
9 execute immediate 'alter trigger rep_feature_control disable';
10 update feature_control set pages = '0';
11 end if;
12 end;
13 /
PL/SQL procedure successfully completed.
SQL>
尽管如此,但我没有多大意义,因为唯一的影响就是两个触发器将被禁用。 pages
列的值始终为'0'
,否则根本不会执行该代码。另外,整个示例意味着feature_control
表应该包含一行(否则select
将返回too-many-rows
或no-data-found
)。
无论如何,您可能就是这样做的。看看是否有帮助。