2016-07-22 15 views
0

アポストロフィ(')および( '')を数行に含むcsvファイルを使用して、SQL表にデータを挿入する必要があります。 私はそれを以下の方法で処理することができました。SQLデータ内のアポストロフィ( ')、oracle 11g

open_quoteとclose_quoteを取得し、これら2つの変数の間にusernameとemail_idを入れます。

SELECT CHR(113)||CHR(39)||CHR(91) INTO OPEN_QUOTE FROM dual; 
SELECT CHR(93)||CHR(39) INTO CLOSE_QUOTE FROM dual; 

enter image description here それはugly.I、交換を使用することもできましたが、私はこの方法を選んだ見えます。

私のコードがよく見えるように他の方法を教えてもらえますか? 添付されているのは動的SQLのスクリーンショットです。

+0

"CSVファイルをどのように使用していますか"あなたのコードスニペットは、 'C1.EMAIL'と' C1.NAME'という式を使用しています。これは既存のテーブルから値を取得することを意味します。私があなたのコードを見ることができれば、より良いアプローチは、行ごとに一意のSQLステートメントを作成するのではなく、バインド変数を使用することです。 –

答えて

2

文字列に1つの引用符を付けることができます。たとえば:

あなたが持つことができるPL/SQLでのOracle 10gのよう
select 'It''s Bob''s book' 
from dual; 
1


V_SQL_STATEMENT := q'[It's Bob's book]';
は、テキスト・リテラルの詳細についてはOracle SQL Referenceを参照してください。

0

連結の代わりに代わりの引用メカニズムといくつかのREPLACEを使用してください。これは少し余分な作業ですが、最終的なSQL文がどのように見えるかを明確にします。

v_sql_statement := replace(replace(replace(replace(
    q'[ 
     insert into login 
     (USER_ID,CLIENT_ID,EMAIL,PSWD_HASH,NETWORK_ID,FAILED_LOGIN_ATTEMPTS,NAME) 
     VALUES 
     (
      LOGIN_SEQ.nextval, 
      #P_CLIENT_ID#, 
      '#PARSE_EMAIL#', 
      #V_PSWD_HASH#, 
      NULL, 
      0, 
      '#USER_NAME#' 
     ) 
    ]' 
    , '#P_CLIENT_ID#', p_client_id) 
    , '#PARSE_EMAIL#', parse_email(lower(c1.email))) 
    , '#V_PSWD_HASH#', v_pswd_hash) 
    , '#USER_NAME#', nvl(c1.name, generate_user_name(parse_email(c1.email)))) 
;