Problém je v tom, že SQL*Plus interpretuje váš první ;
jako terminátor příkazu. Možná jste si všimli, že pokud zapíšete příkazy do textového souboru a provedete jej (nebo jej upravíte v textovém editoru pomocí SQL*Plus), funguje to.
Aby to fungovalo s živým psaním, pokud to opravdu chcete udělat (zdá se to nepravděpodobné, pokud budou velmi dlouhé!), můžete vypnout automatickou detekci terminátoru pomocí SET SQLTERMINATOR off
. Všimněte si, že budete muset říct SQL*Plus, že jste skončili a že by se měl spustit pomocí /
instrukce jako druhý ;
je také ignorováno.
SQL> SPOOL myscript.sql
SQL> SET SQLTERMINATOR off
SQL> SELECT q'[SPOOL log
2 SELECT COUNT(*) FROM DUAL;
3 PROMPT Done.
4 ]' FROM DUAL
5 /
SPOOL log
SELECT COUNT(*) FROM DUAL;
PROMPT Done.
Pokud je vytváříte z datového slovníku, další možností je použít PL/SQL k provádění dotazů a manipulací a dbms_output
k vytvoření výstupu, který chcete zařadit, pokud konečná velikost souboru nepřekročí limity vyrovnávací paměti.