如何根据用户输入以两种不同的方式输出PL/SQL脚本?

如何根据用户输入以两种不同的方式输出PL/SQL脚本?,sql,oracle,plsql,Sql,Oracle,Plsql,我正在编写一个PL/SQL脚本,该脚本将由用户决定在SQL Plus窗口中显示结果,或根据用户输入将其导出为.CSV文件: ACCEPT output_location PROMPT 'Output: (S) -SQL Output to Screen (E) - Export to .CSV: ' !touch /my_path/My_output_file.csv DECLARE (list of variables); CURSOR my_cursor IS ...

我正在编写一个PL/SQL脚本,该脚本将由用户决定在SQL Plus窗口中显示结果,或根据用户输入将其导出为.CSV文件:

ACCEPT output_location PROMPT 'Output: (S) -SQL Output to Screen  (E) - Export to .CSV:  '

!touch /my_path/My_output_file.csv

DECLARE
    (list of variables);
    CURSOR my_cursor IS ...;

BEGIN
    IF '&output_location' = 'E' THEN

        SPOOL $PWD/My_Output_File

        OPEN my_cursor;
        FETCH my_cursor into...;
        WHILE (my_cursor%FOUND) LOOP
            DBMS_OUTPUT.PUT_LINE(my output data);
            FETCH my_cursor into...;
        END LOOP;
        CLOSE my_cursor;

        SPOOL OFF

        !cp $PWD/My_output_file.lst $PWD/My_output_file.csv
        set define ">"
        !/libreoffice/program/soffice.bin
        set define "&"
    ELSE IF '&output_location' = 'S' THEN
        (Code to output cursor info as a normal SQL execution)
    END IF;
END;
/
如果我将所有假脱机和文件打开命令移到
开始-结束
块之外,则
打开我的光标
关闭我的光标
之间的所有操作都有效。就目前情况而言,它给了我一个错误:

PLS-00181:不支持的预处理器指令“$PWD”


我可以移动这些命令,只需要两个不同的脚本就可以让用户运行,但我更喜欢一站式操作。如何将这一个脚本拆分为两种不同的输出模式?

这有点不匹配。您将PL/SQL与
bash
命令混合使用

!cp $PWD/My_output_file.lst $PWD/My_output_file.csv
        set define ">"
        !/libreoffice/program/soffice.bin
        set define "&"

这是无效的PL/SQL,在这里不起作用。您必须拆分脚本,或者使用
bash
而不是
utl\u文件
包来创建和处理文件。

这是一种不匹配。您将PL/SQL与
bash
命令混合使用

!cp $PWD/My_output_file.lst $PWD/My_output_file.csv
        set define ">"
        !/libreoffice/program/soffice.bin
        set define "&"

这是无效的PL/SQL,在这里不起作用。您必须拆分脚本,或者使用
bash
而不是
utl\u文件
包来创建和处理文件。

很抱歉,PL/SQL不支持操作系统调用。这里有一些变通办法,但与你在这里尝试的完全不同。你能给我指出一个变通办法的正确方向吗?我可以,但为什么?为什么不使用“正确”的方法,即从shell脚本控制执行流,而不是从PL/SQL内部控制执行流呢?这就是我的意思。你能告诉我如何正确地做这件事吗?目前我根本不知道如何做到这一点。当你说“从shell脚本控制执行流”时,我不知道你在说什么,我也不知道从哪里开始查找。对不起,PL/SQL不支持操作系统调用。这里有一些变通办法,但与你在这里尝试的完全不同。你能给我指出一个变通办法的正确方向吗?我可以,但为什么?为什么不使用“正确”的方法,即从shell脚本控制执行流,而不是从PL/SQL内部控制执行流呢?这就是我的意思。你能告诉我如何正确地做这件事吗?目前我根本不知道如何做到这一点。当你说“从shell脚本控制执行流”时,我不熟悉你在说什么,我不知道从哪里开始查找。
utl_文件
将适用于有限的文件操作,但OP也尝试运行一个程序,
soffice.bin
utl\u文件
无法处理此类呼叫。你说得对。我没有注意到这个程序不是其他文件。人们可以在Oracle中创建可执行程序,但这对我来说非常复杂。但是,也许可以从may Help创建程序。简单的回答是,条件执行路径应该在脚本(封装PL/SQL代码)中实现,而不是在PL/SQL代码本身中实现。
utl_文件
将适用于有限的文件操作,但OP也尝试运行一个程序,
soffice.bin
utl\u文件
无法处理此类呼叫。你说得对。我没有注意到这个程序不是其他文件。人们可以在Oracle中创建可执行程序,但这对我来说非常复杂。但是,也许从may help创建_程序简单的回答是,条件执行路径应该在脚本中实现(封装PL/SQL代码),而不是在PL/SQL代码本身中实现。