我有一个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;
我在表中输入了几个值,只应动态插入此值。有更简单的方法吗?
答案 0 :(得分: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
答案 1 :(得分: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,它甚至可能不需要包含在函数(或过程)中,这取决于你正在做什么。