2017-10-05 8 views
3

以下のコードはほとんどの場合問題ありません。不足しているコンマORA-00917 SQL問合せでアポストロフィをエスケープする

req := 'INSERT INTO CLIENTS(
        IDEVT, 
        ID_CLIENT, 
        CATEGORIE_CLIENT, 
        SEGCO, 
        LIB_SEGCO, 
        NOM, 
        ADRESSE, 
        CODE_POSTAL, 
        VILLE, 
        PAYS, 
        STATUT) 
        values(''' || UNID ||''','''||ID||''','''||SEGCO||''','''||L_SEGCO ||''','''||**LIB_SEGCO** ||''','''|| NOM||''','''|| 
        ADRESSE||''','''||CODE_POSTAL||''','''||cVILLE||''','''||PAYS||''','''||CODE_STATUT||''')'; 

     execute immediate req; 

任意のアイデアをするときアポストロフィをエスケープする: それはLIB_SEGCOが、それはエラーになりますORA-00917がこれらのケースでは、このようなABC'DEF

として任意の単一引用符 を持っていたときに吹きますそれは変数で渡された?

おかげ

+1

この例では、動的SQLを使用する必要はありません。静的な 'INSERT'ステートメントを使用してください。変数「UNID、ID、....」はすでにPL/SQLエンジンによってバインド変数として扱われています。 –

答えて

6

用途:

req := q'{INSERT INTO CLIENTS(
        IDEVT, 
        ID_CLIENT, 
        CATEGORIE_CLIENT, 
        SEGCO, 
        LIB_SEGCO, 
        NOM,RCS_ADRESSE, 
        CODE_POSTAL, 
        VILLE, 
        PAYS, 
        STATUT) 
        values(:1, :2, :3, :4, :5, :6 
          :7, :8, :9, :10)}'; 

     execute immediate req 
     USING UNID , ID , SEGCO , L_SEGCO , LIB_SEGCO , 
       NOM , ADRESSE , CODE_POSTAL , cVILLE , PAYS ; 

注:INSERTコマンドに記載されている唯一の10列があるので、私は, CODE_STATUTをommitedが、CODE_STATUTは11日なので、列数が一致しません値の数。

+0

ありがとうございました。それは動作します:) –

+0

@ O.Sam - これは "1つの出来事"ではありません。将来のためにこれを念頭に置いてください。技術名称は "q quoting mechanism"です - 一重引用符ではなく、文字列全体を 'q '{' ... '}''または 'q '#' ... '#''などの中に囲みます。文字列内の一重引用符をエスケープする必要はありません。詳細は、https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements003.htm#i42617を参照してください。 – mathguy