如果表格不存在,则插入其他表格

时间:2015-09-17 08:23:56

标签: sql oracle plsql

我的程序如下:

create or replace procedure smth
is
some_variable varchar(2;
begin

insert into **table**(col1,col2) (Select id,'text' from TABLE2),
insert into table(col1,col2) (Select id,'text' from TABLE3)

我想要做的是在例如情况下为案例添加一些if-else(或smo​​ething else)语句。表2不存在。 如果Table2不存在,则从DUAL插入(' smth',' nameoftable')。我确切知道table2的名称是什么。 (但出于某种原因,可以从数据库中删除此表。)

如果我能这样做会很棒:

insert into **table**(col1,col2) if table2 doesn't exist then Select (1,'TABLE2') else (Select id,'text' from TABLE2),

if table3 doesn't exist then Select (1,'TABLE3') insert into table(col1,col2)  else (Select id,'text' from TABLE3)

对于每个案例。

修改

 insert into **table**(col1,col2) (Select id,'text' from TABLE2),
    insert into table(col1,col2) (Select id,'text' from TABLE3)
    insert into table(col1,col2) (Select id,'text' from TABLE4)
    insert into table(col1,col2) (Select id,'text' from TABLE4)

假设table3不存在,那么我想要的就是INSERT into table(选择' text',' text2'来自dual。

3 个答案:

答案 0 :(得分:3)

为了得到你想要的两件事

  1. 查找表是否存在:您可以查询user_tables 如果过程正在从表中读取,则table_name列 相同的架构
  2. 你需要使用动态sql,因为如果表不存在 使用静态pl / sql,您会收到错误 PL / SQL:ORA-00942:table或     视图不存在因为当oracle编译它的程序时 找不到桌子。
  3. 动态plsql的一个例子是

     sql_stmt := 'insert into table(col1,col2) (Select id,''text'' from ' || <the right table_name> || ')';
     EXECUTE IMMEDIATE sql_stmt;
    

    以下是dynamic sql的oracle文档的链接。

    修改 澄清之后可以用这样的程序结束:

      create or replace procedure insert_from_dual_if_not_exists(table_name_in in varchar2)    
        begin
        .....
        if table_exists('<table_name>') then
        sql_stmt := 'insert into table(col1,col2)' (Select id,''text'' from ' || <the right table_name> || ')';
        else
        sql_stmt := 'insert into table(col1,col2)' (Select ''text1'',''text2'' from dual )';
        end if;
        EXECUTE IMMEDIATE sql_stmt;
        end;
    

    并致电insert_from_dual_if_not_exists而不是简单的插入;如果表存在,你还必须创建一个程序(或一个简单的语句)来处理代码。

答案 1 :(得分:1)

您可以查询 USER_TABLES 视图以查看该表是否确实存在。并且,您必须(ab)使用 EXECUTE IMMEDIATE 来执行动态sql。

例如,

SELECT COUNT(*) 
INTO   v_cnt 
FROM   USER_TABLES 
WHERE  TABLE_NAME = '<TABLE_1>';

v_sql := INSERT INTO TABLE(col1,col2).. SELECT id,'text'  FROM ';

IF v_cnt > 0
THEN
   v:sql := v_sql || TABLE_1;
   EXECUTE IMMEDIATE v_sql;
ELSE
   v:sql := v_sql || TABLE_2;
   EXECUTE IMMEDIATE v_sql;
END IF;

UPDATE OP希望动态使用table_name从多个表中插入另一个表。

遍历所有表,并使用table_name作为动态sql中的变量。

例如,

FOR i IN SELECT table_name FROM user_tables WHERE table_name <> 'inserting_table'
LOOP
   v_sql := 'INSERT INTO inserting_table SELECT column_list FROM' || i.table_name;
   EXECUTE IMMEDIATE v_sql;
END LOOP;

答案 2 :(得分:1)

您可以尝试执行此类过程,执行包含匿名块的动态sql并使用sqlcode捕获异常

create or replace procedure testproc
is 
v_sql varchar2(4000) := q'[
declare
begin
 insert into table3 values(1,2);
end;]';
begin
execute immediate v_sql;
exception when others
  then if
sqlcode='-6550' then 
 insert into **table** values()
end if;
 end testproc;