PLSQL ORA-22275:使用CLOB / BLOB时无效的LOB定位符

时间:2017-04-12 17:17:24

标签: oracle plsql oracle11g blob clob

我很长时间没有完成PLSQL,并尝试运行脚本来协助查询XML blob。

该脚本来自一个旧线程,(https://community.oracle.com/thread/514518)当时显然工作但似乎在11.2上运行时遇到了问题。

我的dbs: Oracle Database 11g 11.2.0.4.0版 - 64位生产 PL / SQL版本11.2.0.4.0 - 生产 “核心11.2.0.4.0生产” 适用于Linux的TNS:版本11.2.0.4.0 - 生产 NLSRTL版本11.2.0.4.0 - 生产

CREATE OR REPLACE FUNCTION XBLOB_To_CLOB(L_BLOB BLOB) RETURN CLOB IS
L_CLOB CLOB;
L_SRC_OFFSET NUMBER;
L_DEST_OFFSET NUMBER;
L_BLOB_CSID NUMBER := DBMS_LOB.DEFAULT_CSID;
V_LANG_CONTEXT NUMBER := DBMS_LOB.DEFAULT_LANG_CTX;
L_WARNING NUMBER;
L_AMOUNT NUMBER;
BEGIN
  IF DBMS_LOB.GETLENGTH(L_BLOB) > 0 THEN
     DBMS_LOB.CREATETEMPORARY(L_CLOB, TRUE);
     L_SRC_OFFSET := 1;
     L_DEST_OFFSET := 1;
     L_AMOUNT := DBMS_LOB.GETLENGTH(L_BLOB);
DBMS_LOB.CONVERTTOCLOB(L_CLOB,
  L_BLOB,
  L_AMOUNT,
  L_SRC_OFFSET,
  L_DEST_OFFSET,
  1,
  V_LANG_CONTEXT,
  L_WARNING);
RETURN L_CLOB;
  ELSE
    L_CLOB:= TO_CLOB('');
    RETURN L_CLOB;
End IF;
  DBMS_LOB.FREETEMPORARY(L_CLOB);
END;

ORA-06502:PL / SQL:数字或值错误:指定了无效的LOB定位符: ORA-22275 ORA-06512:在“SYS.DBMS_LOB”中,第978行 ORA-06512:在“TEST.XBLOB_To_CLOB”第14行

目前,脚本不是由另一个脚本或远程函数执行的,我只是试图在SQL Developer中运行它。 我知道有很多关于ORA-22275的问题,但我发现没有什么看起来像我的问题。 显然运行良好的线程上的其他脚本返回相同的ORA-22275错误。

代码或dbs的任何建议都有错误吗?

3 个答案:

答案 0 :(得分:0)

在检查blob的长度之前添加以下内容怎么样?

DBMS_LOB.CREATETEMPORARY(L_BLOB, TRUE);

答案 1 :(得分:0)

如果您使用空L_BLOB调用proc,那么您的条件会转到ELSE,您使用L_CLOB,但没有为其定义定位器,因此您应该放置{{ 1}} CREATETEMPORARY阻止。

答案 2 :(得分:0)

当输入参数 L_BLOB 为空时,会出现此错误。对于空值函数,GetLength返回null,然后启动ELSE条件。

最后,您尝试为具有默认空值的变量调用 DBMS_LOB.FREETEMPORARY(L_CLOB); 。对于null-value函数,FreeTemporary返回指定的无效LOB定位符:ORA-22275。 您应该在ELSE块中初始化L_CLOB或在调用函数FreeTemporary之前检查L_CLOB。