每个人每天的美好时光。 我在上周的工作中遇到了一个很大的问题。 这是一笔交易:
我需要通过SAS从ORACLE数据库下载exel文件(blob)。 我正在使用:
第一步我需要从oracle获取数据。我使用了构造(blob文件接近100kb):
$_FILE['img']['name'] = $imageName
结果是:
proc sql;
connect to oracle;
create table SASTBL as
select * from connection to oracle (
select dbms_lob.substr(myblobfield,1,32767) as blob_1,
dbms_lob.substr(myblobfield,32768,32767) as blob_2,
dbms_lob.substr(myblobfield,65535,32767) as blob_3,
dbms_lob.substr(myblobfield,97302,32767) as blob_4
from my_tbl;
);
quit;
我不明白为什么该字段包含“02”(整个文件)
sas中任何变量的长度都是1024(而不是37767)$ HEX2024格式。 如果我接受:
来自同一个对象的dbms_lob.substr(my_blob_field,2000,900)结果将更加类似于事实: blob =“A234ABC4536AE7 ......”
问题是:1。如何通过SAS正确地从blob字段获取二进制数据?我的错是什么?
谢谢。
编辑1:
我得到的信息但最大字符串是2000 kb。
答案 0 :(得分:0)
PROC SQL使用SQL与SAS数据集交互(创建表,查询表,聚合数据,外部连接等)。该过程主要遵循ANSI标准,并具有一些SAS特定扩展。每个RDMS都扩展了包括Oracle在内的ANSI及其XML处理,例如在blob列中保存内容。可能,SAS无法正确读取Oracle特定的(非ANSI)二进制大对象类型。通常,SAS处理字符串,数字,日期时间和其他一些类型。
作为替代方案,请考虑从外部将XML内容保存为.xml
文件,并使用SAS的XML引擎将内容读入SAS数据集:
** STORING XML CONTENT;
libname tempdata xml 'C:\Path\To\XML\File.xml';
** APPEND CONTENT TO SAS DATASET;
data Work.XMLData;
set tempdata.NodeName; /* CHANGE TO REPEAT PARENT NODE OF XML. */
run;
答案 1 :(得分:0)
使用CONNECT语句(或LIBNAME语句)上的DBMAX_TEXT选项最多可获得32,767个字符。默认值可能是1024。
答案 2 :(得分:0)
添加另一个答案,因为我还没有评论......您遇到的问题是dbms_lob.substr的返回实际上是一个varchar,因此SAS将其限制为2,000。为避免这种情况,您可以将其包装在to_clob(...) AND 中设置DBMAX_TEXT选项,如前所述。
另一种选择是......
以下代码是检索具有大CLOB的单个记录的有效方法。它不是计算将clob拆分成多少个字段而导致记录非常宽,而是将其拆分为多行。查看底部的预期输出。
免责声明:尽管效果可能不高,即可能无法很好地扩展到多行,但通常接受的方法是行流水线化PLSQL。话虽如此,如果你不能做出一个程序,下面让我失去了压力......
PROC SQL;
connect to oracle (authdomain=YOUR_Auth path=devdb DBMAX_TEXT=32767 );
create table clob_chunks (compress=yes) as
select *
from connection to Oracle (
SELECT id
, key
, level clob_order
, regexp_substr(clob_value, '.{1,32767}', 1, level, 'n') clob_chunk
FROM (
SELECT id, key, clob_value
FROM schema.table
WHERE id = 123
)
CONNECT BY LEVEL <= regexp_count(clob_value, '.{1,32767}',1,'n')
)
order by id, key, clob_order;
disconnect from oracle;
QUIT;
预期产出:
ID KEY CHUNK CLOB
1 1 1 short_clob
2 2 1 long clob chunk1of3
2 2 2 long clob chunk2of3
2 2 3 long clob chunk3of3
3 3 1 another_short_one
说明:
参考文献: