基于if条件的oracle查询序列

时间:2019-09-08 13:56:17

标签: oracle if-statement plsql oracle11g

如果我的第一个查询的输出为“ 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';

2 个答案:

答案 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-rowsno-data-found)。

无论如何,您可能就是这样做的。看看是否有帮助。