Sql 若表不存在,则插入到其他表中

Sql 若表不存在,则插入到其他表中,sql,oracle,plsql,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) 我想做的是在表2不存在的情况下,放一些if-else或smething-else语句。 如果表2

我有如下程序:

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)
我想做的是在表2不存在的情况下,放一些if-else或smething-else语句。 如果表2不存在,则将DUAL中的“nameoftable”插入表“smth”。我确切地知道这张桌子的名字。但由于某些原因,此表可能会从数据库中删除

如果我能这样做就太好了:

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)
每种情况下

编辑 假设表3不存在,那么我想要的就是插入到表中,从dual中选择“text”和“text2”。

您可以查询用户的“表”视图,查看表是否实际存在。而且,必须使用executeimmediate来执行动态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希望动态使用表_名称从多个表插入到另一个表中

循环遍历所有表,并在动态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;

为了得到你想要的东西,你需要两样东西

查找表是否存在:您可以根据 table_name列,如果过程正在从 相同模式 您需要使用动态sql,因为如果表不存在 使用静态pl/sql,您会得到错误pl/sql:ORA-00942:table或 视图不存在,因为oracle在编译过程时 找不到表。 动态plsql的一个例子是

 sql_stmt := 'insert into table(col1,col2) (Select id,''text'' from ' || <the right table_name> || ')';
 EXECUTE IMMEDIATE sql_stmt;
以下是指向的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;

如果不存在,则从\u dual\u调用insert\u,而不是简单的insert;您还必须创建一个过程或一个简单语句,告诉您的代码是否存在表。

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


这是一个非常奇怪的案例;一张桌子不在那里,然后简单地使用另一张桌子。使用存储过程中的INSERT语句,删除表时,过程将变得无效。因此,您需要使用动态SQL,这样DBMS就看不到过程中使用了该表。您好,我没有准确地说出我的期望值。如果表不存在,那么从DUALIt插入'text',text2'就可以了,但是我有太多的表,大约20-25个,那么我必须为每个表重复该代码。我必须将所有内容插入到一个表中,但从大约20-25个表中,其中一些可能不存在。。。。我并没有说得很精确,但若表不存在,那个么我想在表“text”和“1”中插入一些显式数据。再一次,我犯了一些错误:如果表不存在,则从DUALE中插入'text',text2',这将不起作用。如果表_1不存在,块将无法编译。只有当表1和表2都存在时,代码才会编译。您需要使用动态SQL。@maciek2791在这种情况下,您需要使用动态SQL遍历所有这些表。如果更新为True,则会在静态sql中引发编译错误。编辑为使用动态sql。您好,我并没有精确地说出我所期望的。若表不存在,那个么从双精度数据库中插入'text',text2'
  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;
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;