1

我有一个 oracle 函数,该函数具有一个参数,该参数定义应在哪一列中插入值,例如

 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; 

我有几个值要输入到表中,只有这个值应该动态插入。有没有更简单的方法来做到这一点?

4

2 回答 2

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 
于 2013-07-25T20:48:26.423 回答
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);

这会将值放在两列之一中,并将 null 放在另一列中;哪种方式取决于标志值。(我省略了else null这两种情况的暗示,但使用它的意图可能会更清楚)。

由于这现在是普通的 SQL,它甚至可能不需要包装在函数(或过程)中,这取决于你在做什么。

于 2013-07-25T08:32:02.303 回答