【问题标题】:oracle select into variable when select return nothing?oracle 选择变量时选择什么都不返回?
【发布时间】:2012-02-19 14:23:09
【问题描述】:
declare
 fName varchar2(255 char);
begin
 SELECT x.constraint_name into fName FROM all_constraints x
 JOIN all_cons_columns c ON
 c.table_name = x.table_name AND c.constraint_name = x.constraint_name
 WHERE x.table_name = 'MY_TABLE_NAME' AND x.constraint_type = 'R' AND c.column_name ='MY_COLUMN_NAME';
 if fName is not null THEN
  execute immediate 'alter table MY_TABLE_NAME drop constraint ' || fName;
 end if;

 SELECT x.constraint_name into fName FROM all_constraints x
 JOIN all_cons_columns c ON
 c.table_name = x.table_name AND c.constraint_name = x.constraint_name
 WHERE x.table_name = 'OTHER_MY_TABLE_NAME' AND x.constraint_type = 'R' AND c.column_name ='OTHER_MY_COLUMN_NAME';
 if fName is not null THEN
  execute immediate 'alter table OTHER_MY_TABLE_NAME drop constraint ' || fName;
 end if;
end;

嗨@, 我正在使用上面的代码来获取我想要删除的约束的名称,并且我有很多这样的选择,而不是 if -> drop 语句。 我的问题是,如果其中一个选择不返回任何内容,则会引发异常。我可以捕捉到异常,但在“开始结束”结构的末尾(所以在所有的选择语句之后,其余的删除将永远不会被执行)。我该如何安排呢,如果选择什么都不返回,我只是不想放弃任何东西:)

如果有另一种方法来定义一个变量并从 select 中填充它而不抛出异常,无论返回的名称是否为 null,我都会更喜欢它 :)(现在我只是让这个 select 工作,除了选择不返回任何内容的情况:))

【问题讨论】:

    标签: oracle exception select


    【解决方案1】:

    使用多个开始/异常/结束块:

    declare
     fName varchar2(255 char);
    begin
     begin
       SELECT x.constraint_name into fName FROM all_constraints x
       JOIN all_cons_columns c ON
       c.table_name = x.table_name AND c.constraint_name = x.constraint_name
       WHERE x.table_name = 'MY_TABLE_NAME' AND x.constraint_type = 'R' AND c.column_name ='MY_COLUMN_NAME';
    exception
      when no_data_found then
        fName := null;
    end;
    
     if fName is not null THEN
      execute immediate 'alter table MY_TABLE_NAME drop constraint ' || fName;
     end if;
    
    begin    
     SELECT x.constraint_name into fName FROM all_constraints x
     JOIN all_cons_columns c ON
     c.table_name = x.table_name AND c.constraint_name = x.constraint_name
     WHERE x.table_name = 'OTHER_MY_TABLE_NAME' AND x.constraint_type = 'R' AND c.column_name ='OTHER_MY_COLUMN_NAME';
    exception
      when no_data_found then
        fName := null;
    end;
    
     if fName is not null THEN
      execute immediate 'alter table OTHER_MY_TABLE_NAME drop constraint ' || fName;
     end if;
    end;
    

    【讨论】:

      【解决方案2】:

      使用本地程序:

      declare
      
        procedure drop_constraint(i_table_name in varchar2, i_column_name in varchar2)
        is
          l_constr_name varchar2(255 char);
        begin
          SELECT x.constraint_name into fName FROM all_constraints x
          JOIN all_cons_columns c ON c.table_name = x.table_name AND c.constraint_name = x.constraint_name
          WHERE x.table_name = i_table_name AND x.constraint_type = 'R' AND c.column_name = i_column_name;
      
          execute immediate 'alter table ' || i_table_name || ' drop constraint ' || l_constr_name;
      
        exception
          when NO_DATA_FOUND then
            null; -- ignore or print message
        end drop_constraint;
      
      begin
         drop_constraint('MY_TABLE_NAME', 'MY_COLUMN_NAME');
         drop_constraint('OTHER_TABLE_NAME', 'OTHER_COLUMN_NAME');
      end;
      /
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-04
        • 2020-07-30
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 2015-10-11
        相关资源
        最近更新 更多