我在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
答案 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