如果您之前它的執行把你的語句轉換成一個變量,你可以將它輸出:
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;
/
我不明白你爲什麼需要更換?爲什麼不只是'SELECTIN LISTAGG(accounting_dept ||' - '|| full_desc,';')WITHIN GROUP(ORDER BY accounting_dept)FROM table1'? –
「我更改爲動態sql」 - 如何?現在所有這些都是字符串語句的一部分嗎?如果是的話,你使用的其他單引號是什麼? –
@AlexPoole對不起,我犯了一個錯誤我修好了,你知道解決方案嗎? –