如何在 sql*plus 中使用 dbms_lob.substr

Posted

技术标签:

【中文标题】如何在 sql*plus 中使用 dbms_lob.substr【英文标题】:how to use dbms_lob.substr in sql*plus 【发布时间】:2019-09-11 01:10:37 【问题描述】:

给定一张桌子:

desc SOL_3_ARTIFACTS
Name Null Type          
---- ---- ------------- 
DATA      BLOB          
ID        VARCHAR2(100) 

如果我需要使用 SQL*plus 将 BLOB 列的内容读取为 VARHR2,我需要这样的语句:

select UTL_RAW.CAST_TO_VARCHAR2(dbms_lob.substr(lob_loc,2000,1)) 
from SOL_3_ARTIFACTS where ID = 'RETAILPOOLS'

谁能告诉我如何获取特定行 (ID = 'RETAILPOOLS') 的 lob_loc(即 DATA 列的定位器)?

根据 Belayer 的建议,我运行了以下操作但出现错误:

DECLARE
     fil BFILE; 
     pos INTEGER;
     amt BINARY_INTEGER; 
     buf RAW(40); 
BEGIN 
     SELECT SOL_3_ARTIFACTS.DATA INTO fil from SOL_3_ARTIFACTS where ID = 'RETAILPOOLS';
     dbms_lob.open(fil, dbms_lob.lob_readonly);   
     amt := 40; pos := 1 + dbms_lob.getlength(fil); buf := ''; 
     dbms_lob.read(fil, amt, pos, buf); 
     dbms_output.put_line('Read F1 past EOF: '|| 
          utl_raw.cast_to_varchar2(buf)); 
     dbms_lob.close(fil); 
     exception 
     WHEN no_data_found 
     THEN 
       BEGIN 
         dbms_output.put_line('End of File reached. Closing file'); 
         dbms_lob.fileclose(fil); 
         -- or dbms_lob.filecloseall if appropriate 
       END; 
END; 

Error report -
ORA-06550: line 7, column 13:
PL/SQL: ORA-00932: inconsistent datatypes: expected FILE got BLOB
ORA-06550: line 7, column 6:
PL/SQL: SQL Statement ignored
ORA-06550: line 8, column 25:
PLS-00201: identifier 'DBMS_LOB' must be declared
ORA-06550: line 8, column 6:
PL/SQL: Statement ignored
ORA-06550: line 9, column 28:
PLS-00201: identifier 'DBMS_LOB' must be declared
ORA-06550: line 9, column 17:
PL/SQL: Statement ignored
ORA-06550: line 10, column 6:
PLS-00201: identifier 'DBMS_LOB' must be declared
ORA-06550: line 10, column 6:
PL/SQL: Statement ignored
ORA-06550: line 13, column 6:
PLS-00201: identifier 'DBMS_LOB' must be declared
ORA-06550: line 13, column 6:
PL/SQL: Statement ignored
ORA-06550: line 19, column 10:
PLS-00201: identifier 'DBMS_LOB' must be declared
ORA-06550: line 19, column 10:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

【问题讨论】:

见DBMS_LOB OPEN 程序 【参考方案1】:

尝试从这里开始

https://docs.oracle.com/cd/A91202_01/901_doc/appdev.901/a88879/adl02bs4.htm

特别是下面粘贴的这一部分指出,当您选择 blob 时,它会返回 lob 定位器。

通过定位器访问 LOB

选择 LOB 对 LOB 执行 SELECT 会返回定位器而不是 LOB 值。在下面的 PL/SQL 片段中,您为故事选择 LOB 定位器并将其放置在程序块中定义的 PL/SQL 定位器变量 Image1 中。当您使用 PL/SQL DBMS_LOB 函数来操作 LOB 值时,您使用定位器来引用 LOB。

DECLARE
    Image1       BLOB;
    ImageNum     INTEGER := 101;
BEGIN
    SELECT story INTO Image1 FROM Multimedia_tab
        WHERE clip_id = ImageNum;
    DBMS_OUTPUT.PUT_LINE('Size of the Image is: ' ||
        DBMS_LOB.GETLENGTH(Image1));
    /* more LOB routines */
END;

【讨论】:

以上是关于如何在 sql*plus 中使用 dbms_lob.substr的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PL/SQL 中使用 select 语句为 SQL*Plus 变量赋值?

如何使用 SQL*Plus 在 Oracle 11g 中显示数据库

如何在 SQL Plus/SQL-PL 中使用迭代或作为函数运行查询?

如何在 sql*plus 中修复我的假脱机 csv 文件中的格式

如何在 SQL*PLUS 中定义持久变量

如何在 UNIX shell 脚本中执行临时存储过程?是不是可以在 sql-plus 中使用 IF-ELSE/WHILE 循环?