2017-04-08 5 views
0

大きな行列から3つの列で構成される表にデータを転置するプロシージャの作業中です。テーブルに行を動的に挿入するのが難しいです。私は、以下の手順でブロックを実行しようとすると、私はエラーメッセージを指定を取得します:動的INSERTプロシージャで失敗しますが、静的SQLとして機能します

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

手順は、私は、静的SQLをコピーして実行することができ、有効なINSERT文を生成します。 までのすべてを実行するとすぐにstmntが正常に動作しています。さらに、私は完全に機能するほぼ同じ手順を持っています。両者の違いは1つだけです。現用バージョンでは、挿入される値はすべて「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 
) 

環境:Ubuntuの16.04 のOracle 12cのコミュニティ版の SQL開発。

+0

をバインド変数を使用する必要がありますか?もしそれがnullなら、 'values( 'X'、 'Y'、) 'のような文を得るでしょう。 –

答えて

1

あなたは、 `読み込まれますmy_rec.measurement`んつまり

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文を構築することは、キャッシュ駆逐艦であり、発見したようにエラーが発生しやすくなります。 –

関連する問題