我在Oracle Table上有一个存储PDF文件的CLOB字段.当我尝试将此字段导出到Azure上的SQL Server Db时,我收到此错误:
2017/01/19 11:14:32 - ImpostoRenda 2.0 - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : Unexpected batch update error committing the database connection.
2017/01/19 11:14:32 - ImpostoRenda 2.0 - ERROR (version 6.1.0.1-196, build 1 from 2016-04-07 12.08.49 by buildguy) : org.pentaho.di.core.exception.KettleDatabaseBatchException:
2017/01/19 11:14:32 - ImpostoRenda 2.0 - Error updating batch
2017/01/19 11:14:32 - ImpostoRenda 2.0 - I/O Error: Connection reset by peer: socket write error
2017/01/19 11:14:32 - ImpostoRenda 2.0 -
2017/01/19 11:14:32 - …
Run Code Online (Sandbox Code Playgroud) 关于我之前的问题返回显式游标的SQL语句,我能够(.xls)
使用DBMS_SQL
和生成一个Excel 文件UTL_FILE
并传递SYS_REFCURSOR
(代码在上一个问题中).但是,我遇到的一个挑战是生成的文件超过25 MB.我将通过电子邮件将其传输给业务用户,它肯定会填满他们的邮箱大小.当我手动提取xlsx
使用SQL Developer
它时,只生成大约4 MB的数据.
要解决这个问题,是否可以通过PL/SQL
以下方式进行?
.xlsx
)生成文件以压缩大小.xls
在传输之前压缩文件我也在这里回顾了类似的帖子,例如在Oracle中使用UTL_FILE包在ExcelSheet中编写,但正如答案所述,它需要使用Java.所以它不适用于我.另一篇文章,即从Oracle数据库创建Excel电子表格,也在使用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
Run Code Online (Sandbox Code Playgroud) 我们计划安装该UTL_MAIL
软件包,并且当前正在测试开发环境中的安装步骤。成功安装UTL_MAIL
软件包脚本并创建足够的“ PUBLIC
同义词和授予”之后,ORA-29278
在运行下面的测试“匿名块”时会出现错误:
BEGIN
UTL_MAIL.SEND(sender => 'xxx@oracle.com'
, recipients => 'Migs.Isip.23@gmail.com'
, subject => 'Testmail'
, message => 'Hello');
END;
Run Code Online (Sandbox Code Playgroud)
错误消息的完整详细信息:
ORA-29278: SMTP transient error: 421 4.3.2 Service not available
ORA-06512: at "SYS.UTL_MAIL", line 662
ORA-06512: at "SYS.UTL_MAIL", line 679
ORA-06512: at line 3
29278. 00000 - "SMTP transient error: %s"
*Cause: A SMTP transient error occurred.
*Action: Correct the error and retry the SMTP operation.
Run Code Online (Sandbox Code Playgroud)
根据相关链接的研究(使用PLSQL发送电子邮件),我可能需要设置适当的访问控制列表(ACL)才能起作用。但是,执行以下脚本后,我仍然遇到相同的错误。
DECLARE
-- ACL name to …
Run Code Online (Sandbox Code Playgroud) 免责声明:请留下详细而详细的问题.我想尽可能明确要求.
以下种子表(SAMPLE_EXTRA_INFO
)存储员工的额外信息:
EIT_ID EMPLOYEE_NUMBER EXTRA_INFORMATION INFORMATION_CATEGORY INFORMATION1 INFORMATION2 INFORMATION3 .... INFORMATION10
------ ------------------- --------------------- ---------------------- -------------- ------------- ------------ --------------
1 11111 Academic Rank Next Academic Rank Professor Y 10.5 (NULL)
2 11111 Academic Rank Academic Rank Ass.Professor N (NULL) (NULL)
3 11111 Academic Rank Effective Start Date 01-JAN-2017 (NULL) (NULL) (NULL)
4 11111 Academic Rank Effective End Date 31-DEC-4712 (NULL) (NULL) (NULL)
5 11111 Alien Income Forecast Income_code P (NULL) (NULL) (NULL)
6 11111 Alien Income Forecast Date …
Run Code Online (Sandbox Code Playgroud) 从我的另一个问题,使用带有字符串限定符的REGEXP_SUBSTR,我试图决定哪种方法更好用.
由此产生的数据集只应delimters之前显示的字符串PLE
,#
并ALL
以正确的顺序.包中已有的当前查询是这样的(DDL和DML位于帖子的底部):
SELECT DATA1
, DECODE(SIGN(0 - instr(DATA1, 'PLE')), -1, SUBSTR(DATA1, 1, instr(DATA1, 'PLE') - 1)) GET_DATA_TILL_FIRST_PLE
, DECODE(SIGN(0 - instr(DATA1, '#')), -1, SUBSTR(DATA1, 1, instr(DATA1, '#') - 1)) GET_DATA_TILL_FIRST_NUM_SIGN
, DECODE(SIGN(0 - instr(DATA1, 'ALL')), -1, SUBSTR(DATA1, 1, instr(DATA1, 'ALL') - 1)) GET_DATA_TILL_FIRST_ALL
, NVL(DECODE(SIGN(0 - instr(DATA1, 'PLE')), -1, SUBSTR(DATA1, 1, instr(DATA1, 'PLE') - 1), 0,
DECODE(SIGN(0 - instr(DATA1, '#')), -1, SUBSTR(DATA1, 1, instr(DATA1, '#') - 1), 0,
DECODE(SIGN(0 - instr(DATA1, 'ALL')), …
Run Code Online (Sandbox Code Playgroud) 在Oracle中编辑和编写存储过程有很多选项; 什么是最好的工具,为什么?(每个答案一个工具.)
我们有某个 SQL_ID 存在性能问题(例如 cd123812jedjdu)。这是从 PKG1 调用的 AWR 报告中显示的。但是,PKG1 内部调用了这么多包,如下所示:
PKG1.MAIN
-> PKG1.PROC1
-> -> PKG2.PROC1
-> -> PKG2.PROC2
-> -> PKG2.PROC3
-> PKG1.PROC2
-> -> PKG3.PROC1
-> -> PKG3.PROC2
-> -> PKG3.PROC3
-> PKG1.PROC3
-> -> PKG4.PROC1
-> -> PKG4.PROC2
-> -> PKG4.PROC3
-> PKG1.PROC4
-> -> PKG5.PROC1
-> -> PKG5.PROC2
-> -> PKG5.PROC3
Run Code Online (Sandbox Code Playgroud)
经过数小时的跟踪,我发现它是从PKG4.PROC3
. 无论如何我可以找到调用 SQL_ID 的实际 PL/SQL 包,也许是v$
视图?
注意:我知道 SQL_TEXT 可以是来自v$
视图的查询,但是有多个具有相同 SQL_TEXT 的类似查询。
以Oracle论坛中显示的示例:使用plsql生成excel(xls),我想从查询的数据集生成excel文件.
提供的示例有效.但是,我遇到了一些挑战:
VARCHAR2
4000字符限制.我提出的是下面的内容:
包装定义:
create or replace package tabletoexcel
as
PROCEDURE run_query(p_fh IN UTL_FILE.FILE_TYPE
, p_cur IN SYS_REFCURSOR);
PROCEDURE start_workbook (p_fh IN UTL_FILE.FILE_TYPE);
PROCEDURE end_workbook (p_fh IN UTL_FILE.FILE_TYPE);
PROCEDURE start_worksheet(p_fh IN UTL_FILE.FILE_TYPE
, p_sheetname IN VARCHAR2);
PROCEDURE end_worksheet (p_fh IN UTL_FILE.FILE_TYPE);
PROCEDURE set_date_style (p_fh IN UTL_FILE.FILE_TYPE);
end tabletoexcel;
create or replace package body tabletoexcel
as
PROCEDURE run_query(p_fh UTL_FILE.FILE_TYPE
, p_sql IN VARCHAR2) IS
v_v_val VARCHAR2(4000);
v_n_val NUMBER;
v_d_val DATE;
v_ret NUMBER;
c NUMBER; …
Run Code Online (Sandbox Code Playgroud) 我有一个xlsx文件sample.xlsx
存储在一个远程目录中,大小约为1,699 KB.我已经尝试了两个流行的PL/SQL包(UTL_COMPRESS和AS_ZIP),它们将它们压缩成gzip
和zip
.
使用下面的代码AS_ZIP
,我已将文件压缩为1,619 KB:
declare
g_zipped_blob blob;
l_file_name varchar2(100) := 'sample.xlsx';
l_directory varchar2(100) := 'EXT_TAB_DATA';
begin
as_zip.add1file( g_zipped_blob, l_file_name, as_zip.file2blob(l_directory, l_file_name));
as_zip.finish_zip( g_zipped_blob );
as_zip.save_zip( g_zipped_blob, l_directory, 'my2.zip' );
dbms_lob.freetemporary( g_zipped_blob );
end;
Run Code Online (Sandbox Code Playgroud)
使用下面的代码(取自原始帖子)UTL_COMPRESS
,我将文件压缩为1,618 KB:
DECLARE
in_filename VARCHAR2(100) := 'sample.xlsx';
l_directory varchar2(100) := 'EXT_TAB_DATA';
src_file BFILE;
v_content BLOB;
v_blob_len INTEGER;
v_file utl_file.file_type;
v_buffer RAW(32767);
v_amount BINARY_INTEGER := 32767;
v_pos INTEGER := 1;
BEGIN
src_file …
Run Code Online (Sandbox Code Playgroud)