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 过程中的“假脱机”命令问题的主要内容,如果未能解决你的问题,请参考以下文章