2017-10-05 88 views
3

下面的代碼在大多數情況下工作正常。 它炸燬時LIB_SEGCO有任何單引號 如ABC'DEFORA-00917在sql查詢中轉義撇號

在這種情況下,它提供了錯誤ORA-00917:缺少逗號

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; 

任何想法逃脫撇號時它通過變量?

感謝

+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 ; 

注:我中省略, CODE_STATUT因爲只有10 INSERT命令列出的列,但CODE_STATUT是11日,所以列數不​​匹配數值。

+0

非常感謝。這有效:) –

+0

@ O.Sam - 這不是一個「完成」的事情。請記住未來。技術名稱是「q引用機制」 - 不是單引號,而是將整個字符串括在'q'{'...'}''或'q'#'...'#''等內。您不需要在字符串中轉義單引號。有關完整詳細信息,請參閱https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements003.htm#i42617 – mathguy