2017-04-08 7 views
0

큰 행렬의 데이터를 3 개의 열로 구성된 테이블로 조 변경하는 절차를 진행하고 있습니다. 테이블에 행을 동적으로 삽입하는 데 어려움이 있습니다. 나는 아래의 절차 블록을 실행하려고하면, 나는 오류 메세지를 지정하지 않고 얻을 :동적 INSERT는 프로 시저에서 실패하지만 정적 SQL로 작동합니다.

ORA-00936: missing expression 
ORA-06512: at line 24 
00936. 00000 - "missing expression" 

절차는 내가 복사하고 정적 SQL을 실행할 수있는 유효한 INSERT 문을 생성합니다. 까지 실행하면 즉시 stmnt이 제대로 작동합니다. 더욱이, 나는 완벽하게 기능하는 거의 동일한 절차를 가지고있다. 이 둘 사이에는 단 하나의 차이점이 있습니다. 작업중인 버전에서 삽입 된 모든 값은 "VARCHAR2"유형입니다. 나는 문제 해결을 계속하는 방법을 잃어 버렸다.

declare 
    type rec_type is record(
    row_name varchar2(250), 
    measurement number(30,27) 
    ); 
    my_rec rec_type; 

    type cols_type is table of varchar2(10); 
    cols cols_type; 

    stmnt varchar2(2000); 
    cur sys_refcursor; 
begin 
    select colnames bulk collect into cols from p100_stg1_tmnt_meta; 
    for i in cols.first..cols.last loop 
    stmnt := 'select site_id, '|| cols(i) ||' from p100_stg1_site_matrix'; 
    open cur for stmnt; 
    loop 
     fetch cur into my_rec; 
     exit when cur%notfound; 
     stmnt := 'insert into p100_stg1_site_measurement (site_id, col_name, measurement) values '|| 
     '('''||my_rec.row_name ||''', '''||cols(i)||''', '||my_rec.measurement||')'; 

     --dbms_output.put_line(stmnt); 
    execute immediate stmnt; 
    end loop; 
    end loop; 
end; 
/

위의 절차에 의해 생성 된 INSERT 문의 예 :

insert into p100_stg1_site_measurement (
    site_id, 
    col_name, 
    measurement 
) 
values (
    '5715_C17orf85_S500_RPHS[+80]PEKAFSSNPVVR', 
    'tmnt_2', 
    .0288709682691077 
) 

환경 : 우분투 16.04 오라클 12C 커뮤니티 에디션에 SQL 개발자.

+0

은 어디'채워 my_rec.measurement' 않습니다 즉? 만약 그것이 null이라면'values ​​('X', 'Y',) '와 같은 것을 포함하는 문장을 얻을 것이다. –

답변

1

당신은 바인드 변수를 사용해야은

stmnt := 'insert into p100_stg1_site_measurement (site_id, col_name, measurement) 
    values (:site_id, :col, :measurement)'; 

execute immediate stmnt using my_rec.row_name, cols(i), my_rec.measurement; 
+0

이것은 매력처럼 작동한다. 내 자신의 이해를 위해, 당신 (또는 다른 사람들)은이 방법을 알고 있지만 다른 사람은 알고 있지 않습니까? – user3672527

+1

두 가지 방법을 모두 알고 있지만 루프에서 고유 한 SQL 문을 생성하는 것은 캐시 구축 자이며 발견 한대로 오류가 발생하기 쉽습니다. –