ORACLE:如何使用动态sql插入临时表

时间:2016-12-12 11:20:18

标签: oracle

我在Oracle中使用了一些临时表来存储一些数据,稍后在函数中需要这些数据。为了确定我需要存储在表中的数据,我使用的是动态sql语句(使用参数作为其他表的列名)。我尝试了不同的方法。

第一次,我尝试过这样的事情:

INSERT INTO temp_tableA
EXECUTE IMMEDIATE dynamic_sql
USING IN OUT temp_tableB

另一种方法就像:

EXECUTE IMMEDIATE INTO temp_tableA
USING IN OUT temp_tableB

我已经使用了一些其他临时表(temp_tableB)来存储它看起来的一些数据,它在第一种方法中运行良好,但是我没有使用动态sql语句。如果我试图用动态sql(就像第一种方法一样)这样做,它告诉我,关键字VALUES丢失了。 第二次尝试返回错误消息,即temp_tableA不能用作SELECT / FETCH-Statement的INTO目标。

我错过了什么?我不得不说,我对Oracle很陌生,它开始让我发疯:D

1 个答案:

答案 0 :(得分:2)

假设您有以下表格:

create table someTab(colA number, colB number, colC number);
create table someOtherTab(col varchar2(10), val number);
insert into someTab values (1, 10, 100);
insert into someTab values (2, 20, 200);

你可以定义一个这样的程序:

create or replace procedure copyProc(colName IN varchar2) is
    vSQL varchar2(1000);
begin
    vSQL := 'insert into someOtherTab(col, val) select ''' || colName || ''', ' || colName || ' from someTab';
    --
    dbms_output.put_line(vSQL);
    execute immediate vSQL;
end;

你运行这个程序,这就是你得到的:

SQL> exec copyProc('colA');
insert into someOtherTab(col, val) select 'colA', colA from someTab

PL/SQL procedure successfully completed.

SQL> select * from someOtherTab;

COL               VAL
---------- ----------
colA                1
colA                2

SQL> exec copyProc('colC');
insert into someOtherTab(col, val) select 'colC', colC from someTab

PL/SQL procedure successfully completed.

SQL> select * from someOtherTab;

COL               VAL
---------- ----------
colA                1
colA                2
colC              100
colC              200