我正在尝试解决这样的问题
declare
filename varchar2(100);
begin
for condition in (select fieldN from mytable) loop
filename := 'data_for_value'||condition.fieldN||'txt';
spool filename
select some_data from some_table where fieldN = condition.fieldN;
spool off
end loop;
end;
为了将表中的不同数据部分导出到不同的文件中,但我无法做到正确,我已阅读此内容并尝试执行类似的操作:
set serveroutput on
set pagesize 0
set numwidth 2
set trimspool on
DECLARE
filename varchar2(100);
BEGIN
for field2 in (select field2 from blau2) loop
filename := 'COST_TRAN_BASE '||field2.field2||'.txt';
spool "run_query.sql" REPLACE
select distinct 'spool "' || filename || '.txt"' || chr(10) ||
'select field1, field3 from blau2 where field2 = ' || field2.field2|| ';' || chr(10) ||
'spool off' cmd
from blau2;
spool off
@"run_query.sql"
end loop;
END;
但无济于事。我有一种感觉,我不允许spool
在我尝试的地方使用命令(我最近开始在 Oracle 环境中工作,SQL*Plus 和 PL/SQL 之间的界限仍然有点模糊(你现在可以杀了我)我的无知:')))
我只是在与不可能的事情作斗争吗?丁:
编辑:
在 Balazs Papp 的初步帮助和我的后续调查下,我想出了这个系统: 使用这个文件:
basic_script.txt
-----------------
SET PAGESIZE 0
SET TRIMSPOOL ON
spool RUN_QUERY.sql REPLACE
select distinct 'set heading off' || chr(10) ||
'spool "BLAU2 ' || field2 || '.txt"' || chr(10) ||
'select field1||chr(9)|| field3 from blau2 where field2 = ' ||
field2 || ';' || chr(10) ||
'spool off'
from blau2;
spool off
-----------
还有这个其他文件:
basic_script_condition.sql:
-----------
set feedback off
set trimspool on
set recsep off
set serveroutput on
col some_column new_value script_name
select decode((select count(*) from (select distinct FIELD2 from BLAU2)),1,'exit.sql','RUN_QUERY.sql') some_column from dual;
@&script_name
-----------
在一个简单的 .bat 程序中从命令行调用它们:
basic_launcher.bat:
-------------
echo exit | sqlplus lmartin/lmartin @"BASIC_SCRIPT.txt"
echo exit | sqlplus lmartin/lmartin @"BASIC_SCRIPT_CONDITION.sql"
-------------
只有在有数据要导出的情况下,才会生成并执行导出表中不同部分数据的脚本BLAU2
(如果没有要导出的数据,basic_script 会生成一个 .sql 文件,no rows selected
其内容为,可能重复 N 次,并且执行将失败,因此basic_script_condition.sql
控制此行为)。
只是为了有一些样本数据。
结果:
spool
是一个 SQL*Plus 内部命令。在您的示例中,您尝试在 PL/SQL 块中使用假脱机。PL/SQL 语言不知道假脱机命令。实现您想要的(写入 PL/SQL 中的不同文本文件)的最佳选择是使用 UTL_FILE(Oracle 9i 及更高版本)Oracle 内部包。
http://oracle-base.com/articles/9i/utl_file-random-access-of-files-9i