這可能是一個愚蠢的想法。我正在嘗試編寫一個SQL * Plus .sql腳本,我可以從Windows批處理文件調用該批處理文件,該文件本身使用dbms_output.put_line生成一個新的.sql腳本。這是我到目前爲止有我的劇本:「PL/SQL過程已成功完成」使用dbms_output構建SQL腳本的Oracle SQL腳本
set echo off;
set serverout on;
conn [email protected];
spool E:\new_script.sql
DECLARE
CURSOR c_groups IS
SELECT * FROM table;
s varchar2(4000);
BEGIN
dbms_output.put_line('BEGIN');
FOR x IN c_groups LOOP
s := 'INSERT INTO TABLE blah VALUES ('''||x.name||''','||x.id||');';
END LOOP;
dbms_output.put_line(s);
dbms_output.put_line('COMMIT;');
dbms_output.put_line('END;');
dbms_output.put_line('/');
END;
/
spool off;
exit;
然而,當我這樣做,我的new_script.sql
只是說:任何想法如何使dbms_out.put_line
實際顯示他們的消息?
而我實際上並沒有這樣做來建立插入語句 - 這些只是一個簡單的例子,顯示了我想要做的事情的要點。
+1但是添加'BEGIN'和'END''可能是一個非常好的主意。在緩慢的網絡上,處理一個PL/SQL塊將比處理許多SQL語句快得多。儘管如果PL/SQL塊是巨大的,那麼這種方法會產生'DIANA'錯誤。 –
1)我不認爲你在SET之前或之後CONN是否重要。我的SET ECHO ON在兩個地方工作。 2)在現實生活中,dbms_output調用位於循環內部;那是一個抄寫錯誤。此外,我的循環內部涉及設置變量的函數調用,所以這就是爲什麼我在那裏有BEGIN和END的原因。 3)這些將是有益的,謝謝。 4)這回到#2,因爲我正在循環內進行更多的處理。 我大概可以在沒有匿名BEGIN..END塊的情況下完成包裝整個事情。儘管我最終使用了UTL_FILE,但是感謝您閱讀它。 – Tom
@Tom它對'serveroutput'參數很重要。 'echo'參數無關緊要。 –