我的程序如下:
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(或smoething 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。
答案 0 :(得分:3)
为了得到你想要的两件事
user_tables
如果过程正在从表中读取,则table_name
列
相同的架构动态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;