2013-07-25 87 views
1

我有一個oracle函數,它具有一個參數,該參數定義值應該插入到哪一列,例如,oracle sql動態插入語句

function something(p_value, p_nr) 
is 
    ... 
begin 
    if p_nr = 1 then 
     insert into A (column1) (p_value); 
    else if p_nr = 2 then 
     insert into A (column2) (p_value); 
    ... 
    end if; 

我有幾個值在表中輸入只有這個值應該是動態插入。有沒有更簡單的方法來做到這一點?

回答

2

你可以這樣做:

insert into A (column1, column2) 
values (case when p_nr = 1 then p_value end, 
    case when p_nr = 2 then p_value end); 

這將使價值兩列中的一個,並在其他空;這種方式取決於標誌值。 (我已經從兩種情況中省略了隱含的else null,但意圖可能更清楚)。

由於這是現在普通的SQL,它可能甚至不需要被封裝在一個函數(或過程)中,這取決於你在做什麼。

3

如果你的表結構定義列的缺省值,您也可以考慮有條件插入:

insert all 
when :p_nr = 1 then into A(col1) values(p_value) 
when :p_nr = 2 then into A(col2) values(p_value) 
when :p_nr = 3 then into A(col3) values(p_value) 
select :p_value as p_value from dual 
; 

的優點是,這個查詢榮譽默認值,看一個例子:

create table A(
    col1 varchar2(10) default 'default 1', 
    col2 varchar2(10) default 'default 2', 
    col3 varchar2(10) default 'default 3' 
); 

variable p_nr number 
variable p_value varchar2(100) 

exec :p_nr:=2 
exec :p_value:='value' 

insert into A (col1, col2, col3) 
values (case when :p_nr = 1 then :p_value end, 
     case when :p_nr = 2 then :p_value end, 
     case when :p_nr = 3 then :p_value end); 

select * from A; 

COL1  COL2  COL3  
---------- ---------- ---------- 
      value    

和:

rollback; 

insert all 
when :p_nr = 1 then into A(col1) values(p_value) 
when :p_nr = 2 then into A(col2) values(p_value) 
when :p_nr = 3 then into A(col3) values(p_value) 
select :p_value as p_value from dual 
; 
select * from A; 

COL1  COL2  COL3  
---------- ---------- ---------- 
default 1 value  default 3