2017-04-08 55 views
0

我正在處理一個過程,將數據從一個大矩陣轉置到一個由三列組成的表中。我在動態插入表格時遇到了一些困難。當我嘗試執行以下程序塊,我得到一個錯誤mesage:動態插入在過程失敗,但作爲靜態SQL

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

程序產生一個有效的INSERT語句,我可以複製並執行靜態SQL。一切達到立即執行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 into p100_stg1_site_measurement (
    site_id, 
    col_name, 
    measurement 
) 
values (
    '5715_C17orf85_S500_RPHS[+80]PEKAFSSNPVVR', 
    'tmnt_2', 
    .0288709682691077 
) 

環境: 在Ubuntu 16.04 甲骨文12C社區版SQL開發人員。

+0

哪裏'my_rec.measurement'得到填充?如果它是空的,你會得到一個包含'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語句就像緩存驅逐者一樣,並且如你所發現的那樣容易出錯。 –