2017-08-17 68 views
0

,所以我嘗試將此代碼更改動態SQL改變爲動態SQL轉義如何使用REPLACE函數

SELECT LISTAGG(accounting_dept || '-'||REPLACE(full_desc,'''',''''''), '; ') WITHIN GROUP (ORDER BY accounting_dept) FROM table 

EXCUTE

12121-President''S Office 

我更改爲動態SQL

EXECUTE IMMEDIATE 
    ' SELECT LISTAGG(accounting_dept || ''-''||REPLACE(full_desc,'''''',''''''''), ''; '') WITHIN GROUP (ORDER BY accounting_dept) FROM table ' 

INTO v_task; 

錯誤是ORA-00907:缺少右括號

問題是這部分REPLACE(full_desc,''''',''''''''),

我該如何更改爲動態sql而不會發生警告錯誤?

+0

我不明白你爲什麼需要更換?爲什麼不只是'SELECTIN LISTAGG(accounting_dept ||' - '|| full_desc,';')WITHIN GROUP(ORDER BY accounting_dept)FROM table1'? –

+0

「我更改爲動態sql」 - 如何?現在所有這些都是字符串語句的一部分嗎?如果是的話,你使用的其他單引號是什麼? –

+0

@AlexPoole對不起,我犯了一個錯誤我修好了,你知道解決方案嗎? –

回答

5

如果您之前它的執行把你的語句轉換成一個變量,你可以將它輸出:

set serveroutput on 

declare 
    v_stmt varchar2(2000); 
    v_task varchar2(2000); 
begin 
    v_stmt := 'SELECT LISTAGG(accounting_dept || ''-''||REPLACE(full_desc,'''''',''''''''), ''; '') WITHIN GROUP (ORDER BY accounting_dept) FROM some_table'; 
    dbms_output.put_line(v_stmt); 
    execute immediate v_stmt into v_task; 
end; 
/

這顯示它嘗試執行的語句,然後得到以下錯誤:

SELECT LISTAGG(accounting_dept || '-'||REPLACE(full_desc,''',''''), '; ') WITHIN GROUP (ORDER BY accounting_dept) FROM some_table 

Error report - 
ORA-00911: invalid character 
ORA-06512: at line 7 

如果您在SQL Developer中手動運行生成的語句,您將得到ORA-00907:缺少右括號;不完全確定你是如何動態地或者爲什麼動態地獲取這個錯誤 - 它應該首先用ORA-00911來分析分號。

您可以看到generate語句與您開始的原始靜態語句不匹配。你需要更多的逃脫報價:

declare 
    v_stmt varchar2(2000); 
    v_task varchar2(2000); 
begin 
    v_stmt := 'SELECT LISTAGG(accounting_dept || ''-''||REPLACE(full_desc,'''''''',''''''''''''), ''; '') WITHIN GROUP (ORDER BY accounting_dept) FROM some_table'; 
    dbms_output.put_line(v_stmt); 
    execute immediate v_stmt into v_task; 
end; 
/

SELECT LISTAGG(accounting_dept || '-'||REPLACE(full_desc,'''',''''''), '; ') WITHIN GROUP (ORDER BY accounting_dept) FROM some_table 

PL/SQL procedure successfully completed. 

但照託尼安德魯斯建議,並使用替代引用機制。

不是你甚至需要動態SQL在這裏;這也是一樣的:

declare 
    v_task varchar2(2000); 
begin 
    SELECT LISTAGG(accounting_dept || '-'||REPLACE(full_desc,'''',''''''), '; ') 
    WITHIN GROUP (ORDER BY accounting_dept) 
    INTO v_task 
    FROM tableinto v_task; 
end; 
/
+0

非常感謝,我很抱歉無法發佈整個程序,但您的解釋對我有很大的幫助。我非常感謝你的幫助和建議。感謝你,今天我學到了很多東西。 @alexpoole –

4

如果關閉整個select成一個字符串,用Q報價是這樣的:

q'[SELECT LISTAGG(accounting_dept || '-'||REPLACE(full_desc,'''',''''''), '; ') WITHIN GROUP (ORDER BY accounting_dept) FROM table]' 
+0

謝謝!!!!!這幫了我很多!!!!!!我非常感謝你的幫助。 –

相關問題