我总是想假脱机,但假脱机的实际内容应该是有条件的。这里有一些伪代码来解释我需要的东西:
DECLARE
vCondition VARCHAR2(5) := NULL;
BEGIN
SELECT Field INTO vCondition FROM Table
IF (vCondition = 'True') THEN
spool C:\Location
'Error'
spool OFF;
ELSE
spool C:\Location
'Success'
spool OFF;
END IF;
END;
/
---编辑---
我已经按照你的第一个建议,但由于我的伪代码没有详细说明,我遇到了另一个问题。我需要假脱机语句的结果。你看到这个代码有什么问题吗?
spool C:\Location
set serveroutput on
DECLARE
vCondition VARCHAR2(5) := NULL;
BEGIN
SELECT Field INTO vCondition FROM Table;
IF (vCondition = 'True') THEN
SELECT Field_A || ',' ||
Field_B || ',' ||
Field_C || ',' ||
FROM Table;
ELSE
SELECT Field_X || ',' ||
Field_Y || ',' ||
Field_Z || ',' ||
FROM Table;
END IF;
END;
/
spool OFF;
答案 0 :(得分:1)
您无法从PL / SQL块内部控制假脱机;它是客户端功能,而不是服务器功能,PL / SQL在服务器上执行。您需要在匿名块之外开始/停止假脱机,然后让您的块生成假脱机捕获的输出。
假设您想要假脱机到客户端计算机上的文件,您可以这样做:
spool C:\Location
set serveroutput on
DECLARE
vCondition VARCHAR2(5) := NULL;
BEGIN
SELECT Field INTO vCondition FROM YourTable
IF (vCondition = 'True') THEN
dbms_output.put_line('Error');
ELSE
dbms_output.put_line('Success');
END IF;
END;
/
spool OFF;
除非您控制块的执行,否则您不应该假设dbms_output
将被启用。它对调试很有用,可以在这里使用。但是如果你在一个程序中进行了dbms_output
调用,那么你就不会知道调用它的每个人都能看到输出。
在您的简单示例中,您还可以完全跳过PL / SQL块并使用案例表达式,假设您只查看单个表:
spool C:\Location
set heading off
SELECT CASE WHEN Field = 'True' THEN 'Error' ELSE 'Success' END
FROM YourTable;
spool OFF;
...但我想你的真实代码更复杂,需要使用PL / SQL。
如果您希望文件位于服务器上,则可以使用utl_file
包而不是假脱机。
根据您更新的问题,如果所有查询都针对同一个表格,您可以执行以下操作:
spool C:\Location
set heading off
SELECT CASE WHEN Field = 'True' THEN Field_A ELSE Field_X END ||','||
CASE WHEN Field = 'True' THEN Field_B ELSE Field_Y END ||','||
CASE WHEN Field = 'True' THEN Field_C ELSE Field_Z END
FROM YourTable;
spool OFF;