PL SQL 过程中的“假脱机”命令问题

Posted

技术标签:

【中文标题】PL SQL 过程中的“假脱机”命令问题【英文标题】:Issue with "spool"-commands in PL SQL Procedure 【发布时间】:2019-12-03 10:20:14 【问题描述】:

我试图在其中一个 Oracle DB 中创建一个过程。程序是为我的同事准备的,以便每个人都可以将查询结果导出到 csv 文件中。

我使用的是“假脱机”命令。在 Oracle SQL Developer 中分别运行 BEGIN 和 END 之间的代码时(作为脚本运行,F5) - 它工作正常,并在本地创建了文件。

然后我尝试将其放入程序中,这就是问题开始的地方。出现一些编译错误。他们中的大多数都有代码“PLS-00103”。我尝试搜索它,但到目前为止还没有成功。我什至尝试了 EXECUTE IMMEDIATE 语句,将一些脚本块放入其中 - 到目前为止还没有工作。

我将不胜感激有关处理我的情况的任何提示/帮助。

附:我的第一次尝试如下:

CREATE OR REPLACE PROCEDURE export_to_csv (SOURCE IN VARCHAR2, EXPORT_PATH IN VARCHAR2) is
BEGIN
   spool on;
   set feedback off;
   set heading off; ​ ​ ​
   set sqlformat csv;
   spool EXPORT_PATH;

   select * from SOURCE; 
   spool off;
END export_to_csv;

【问题讨论】:

PL/SQL 在数据库中运行,没有输出流。这就是为什么它的syntax 中没有spool 命令以及为什么select 需要into 子句。 【参考方案1】:

不,这行不通。 SPOOL 以及您使用的所有 SET 命令都是 SQL*Plus

存储过程是 PL/SQL,所以 - 如果你想从那里开始,你必须使用 UTL_FILE 包。结果将在数据库服务器上,而不是在您的本地 PC 上。


或者:

将这些 SPOOL, SET, SELECT, ... 命令放入数据库服务器上的 .SQL 文件中 使用能够运行操作系统文件的DBMS_SCHEDULER 包创建数据库作业。在 MS Windows 上,您将调用 CMD,它使用 SQLPLUS 可执行文件建立与数据库的连接并调用您的 .SQL 脚本(使用 @) 就像上一个选项一样,结果将在数据库服务器上,而不是在本地 PC 上

看看你喜欢哪个选项。

也许创建该 .SQL 文件并将其提供给您的所有同事然后在他们的 PC 上运行并在本地获取结果会更简单。

【讨论】:

以上是关于PL SQL 过程中的“假脱机”命令问题的主要内容,如果未能解决你的问题,请参考以下文章

在没有假脱机或 utl_file 的 PL/SQL 中写入文件

从 pl/sql 块内立即执行的数据假脱机

Oracle PL/SQL 中的字符编码问题

您如何从通过数据库链接执行的存储过程中进行假脱机?

假脱机多个文件

PL/SQL:将字符串的“数组”作为参数传递给 sql