从ORACLE DB通过SAS导入blob

时间:2015-09-12 18:50:22

标签: oracle sas blob

每个人每天的美好时光。 我在上周的工作中遇到了一个很大的问题。 这是一笔交易:

我需要通过SAS从ORACLE数据库下载exel文件(blob)。 我正在使用:

  1. 第一步我需要从oracle获取数据。我使用了构造(blob文件接近100kb):

    $_FILE['img']['name'] = $imageName
  2. 结果是:

    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。

3 个答案:

答案 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

说明:

  1. DBMAX_TEXT告诉SAS为clob字段调整1024的默认值。
  2. 正则表达式。{1,32767}告诉Oracle至少匹配一次但不超过32767次。这会拆分输入并捕获最后一个长度可能低于32767的块。
  3. regexp_substr从clob(param2)的开头开始从clob(param1)中拉出一个块,跳到出现的级别(param3)并将clob视为一个大字符串(param4&#39; n&#39;)。
  4. 通过重新运行正则表达式来连接以计算块,以停止增加超过clob结束的级别。
  5. 参考文献: