关于我之前的问题Return the SQL Statement of an Explicit Cursor,
我能够使用(.xls)
和DBMS_SQL
生成Excel UTL_FILE
文件并传递SYS_REFCURSOR
(代码在上一个问题中)。
但是,我遇到的一个挑战是生成的文件超过25 MB。
我将通过电子邮件将其传输给业务用户,它肯定会填满他们的邮箱大小。
当我使用xlsx
手动提取到SQL Developer
时,它只会生成大约4 MB的数据。
要解决此问题,是否可以通过PL/SQL
执行以下操作?
.xlsx
)生成文件以压缩大小.xls
文件我还审核了SO中的类似帖子,例如Writing in ExcelSheet using UTL_FILE package in Oracle,
但正如答案所述,它需要使用Java。所以它不适用于我。
另一篇帖子Create an Excel Spreadsheet from a Oracle Database也在使用xls
。所以它也不适用。
有什么想法吗?
Oracle版本:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
"CORE 11.2.0.4.0 Production"
TNS for Solaris: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
答案 0 :(得分:5)
我看过Anton Scheffer Create an Excel-file with PL/SQL的一个名为Map
的软件包,它解决了我的问题。
我还修改了一下以放入工作表名称,并允许Map
作为参数而不是我之前的帖子(Return the SQL Statement of an Explicit Cursor)中所需的as_xlsx
。
我在程序重载的包规范中添加了这个:
SYS_REFCURSOR
我在程序包重载程序包中添加了这个(注意:行注释是我修改过的行):
VARCHAR2
这是我创建文件的并发请求中的示例块:
procedure query2sheet
( p_cur IN OUT SYS_REFCURSOR
, p_column_headers boolean := true
, p_directory varchar2 := null
, p_filename varchar2 := null
, p_sheet pls_integer := null
, p_sheetname varchar2 := null
);
希望这有助于某人! :)
答案 1 :(得分:0)
对Oracle数据库中的xls
或xlsx
文件有没有支持。
您可以做的是创建CSV(逗号分隔)文件,然后使用使用java stored procedure的自定义java.util.zip
或使用{{{1}}的PL / SQL过程将其压缩为zip文件3}}
答案 2 :(得分:0)
如果您需要生成XLSX文件并将其发送给业务用户,这听起来就像是DB之外的某些服务的工作。您应该准备一个返回带有报告内容的ref cursor
的过程,然后设置一些使用数据生成PDF或XLSX并发送它的服务。
如果您无法在数据库外部执行此操作,则仍可以在Oracle中使用Java。您可以创建将创建XLSX的Java过程。 Here是Java创建Excel文件的示例。但是创建复杂的Java过程并不是最好的解决方案,可能需要你在DB服务器上安装一些jar,所以我会创建一个返回ref cursor
的过程,其中包含数据和创建文件的小程序,并将其发送到DB之外。