如何根据条件更改我的假脱机?

时间:2016-05-19 18:05:43

标签: oracle plsql

我总是想假脱机,但假脱机的实际内容应该是有条件的。这里有一些伪代码来解释我需要的东西:

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;

1 个答案:

答案 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;