2013-07-25 2 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); 
다른에있는 두 개의 열 중 하나, 그리고 널 (null)의 값을 둘 것

; 어떤 방법으로 라운드 플래그 값에 따라 달라집니다. (두 경우 모두 묵시적 인 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