数字或值错误:原始变量长度太长ORA-06512:位于“ SYS.UTL_RAW”

时间:2018-10-09 10:52:01

标签: oracle plsql oracle11g

从表中选择BLOB(存储的JSON字符串)字段值时,我遇到原始变量长度太长的问题。

查询:

  select utl_raw.cast_to_varchar2(dbms_lob.substr(TRANSACTION_DATA)) from PS_ISA_INB_PAYLOAD_LOG;

这是我用来将JSON对象插入BLOB字段中的SP:

  create or replace PROCEDURE SDIX_TICK_LOG 
    (
      ORGANIZATIONNAME IN VARCHAR2 
    , TRANSACTION_TYPE IN VARCHAR2 
    , TRANSACTION_DATA IN BLOB 
    , TRANSACTION_STATUS IN VARCHAR2 
    ) AS 
     l_r   RAW(32767);

      l_blob        blob;
      l_clob        clob :='"ItemMasterTransfer":[{"ORACLE_UNIQUE_REC_ID":"123assd4434","CUSTOMER_ID":"PMC","ORGANIZATION_CODE":"BMftrdsM","ITEM":"696738","INVENTORY_ITEM_ID":"0000000000000000000000000000546","ORGANIZATION_ID":" ","SUBINVENTORY_CODE":"000000000000000000","LOCATOR_ID":" ","ISA_MATERIAL_GROUP":" ","TAX_GROUP":" ","CATEGORY_ID":"1956","NOUN":" ","MODIFIER":" ","MANUFACTURER_ID":" ","MFG_ITEM_ID":" ","UNIT_OF_MEASURE":"BOX","ITEM_TYPE":"P","STOCK_ENABLED_FLAG":"Y","INVENTORY_ITEM_STATUS_CODE":"A","LIST_PRICE_PER_UNIT":"0","FULL_LEAD_TIME":"0","MAX_MINMAX_QUANTITY":"10","MIN_MINMAX_QUANTITY":"10","SAFETY_LEVEL":"0","REPLENISH_TO_ORDER_FLAG":"N","UTILIZ_CD":"","CURRENCY_CD":"USD","DESCRIPTION":"","ATTRIBUTE1":" ","ATTRIBUTE2":" ","ATTRIBUTE3":" ","ATTRIBUTE4":" ","ATTRIBUTE5":" ","ATTRIBUTE6":" ","ATTRIBUTE7":" ","ATTRIBUTE8":" ","ATTRIBUTE9":" ","ATTRIBUTE10":" ","TRANSACTION_STATUS":" ","TRANS_STATUS_DESCRIPTION":" "},{"ORACLE_UNIQUE_REC_ID":"123assd4434","CUSTOMER_ID":"PMC","ORGANIZATION_CODE":"BMftrdsM","ITEM":"696738","INVENTORY_ITEM_ID":"0000000000000000000000000000546","ORGANIZATION_ID":" ","SUBINVENTORY_CODE":"000000000000000000","LOCATOR_ID":" ","ISA_MATERIAL_GROUP":" ","TAX_GROUP":" ","CATEGORY_ID":"1956","NOUN":" ","MODIFIER":" ","MANUFACTURER_ID":" ","MFG_ITEM_ID":" ","UNIT_OF_MEASURE":"BOX","ITEM_TYPE":"P","STOCK_ENABLED_FLAG":"Y","INVENTORY_ITEM_STATUS_CODE":"A","LIST_PRICE_PER_UNIT":"0","FULL_LEAD_TIME":"0","MAX_MINMAX_QUANTITY":"10","MIN_MINMAX_QUANTITY":"10","SAFETY_LEVEL":"0","REPLENISH_TO_ORDER_FLAG":"N","UTILIZ_CD":"","CURRENCY_CD":"USD","DESCRIPTION":"","ATTRIBUTE1":" ","ATTRIBUTE2":" ","ATTRIBUTE3":" ","ATTRIBUTE4":" ","ATTRIBUTE5":" ","ATTRIBUTE6":" ","ATTRIBUTE7":" ","ATTRIBUTE8":" ","ATTRIBUTE9":" ","ATTRIBUTE10":" ","TRANSACTION_STATUS":" ","TRANS_STATUS_DESCRIPTION":" "},{"ORACLE_UNIQUE_REC_ID":"123assd4434","CUSTOMER_ID":"PMC","ORGANIZATION_CODE":"BMftrdsM","ITEM":"696738","INVENTORY_ITEM_ID":"0000000000000000000000000000546","ORGANIZATION_ID":" ","SUBINVENTORY_CODE":"000000000000000000","LOCATOR_ID":" ","ISA_MATERIAL_GROUP":" ","TAX_GROUP":" ","CATEGORY_ID":"1956","NOUN":" ","MODIFIER":" ","MANUFACTURER_ID":" ","MFG_ITEM_ID":" ","UNIT_OF_MEASURE":"BOX","ITEM_TYPE":"P","STOCK_ENABLED_FLAG":"Y","INVENTORY_ITEM_STATUS_CODE":"A","LIST_PRICE_PER_UNIT":"0","FULL_LEAD_TIME":"0","MAX_MINMAX_QUANTITY":"10","MIN_MINMAX_QUANTITY":"10","SAFETY_LEVEL":"0","REPLENISH_TO_ORDER_FLAG":"N","UTILIZ_CD":"","CURRENCY_CD":"USD","DESCRIPTION":"","ATTRIBUTE1":" ","ATTRIBUTE2":" ","ATTRIBUTE3":" ","ATTRIBUTE4":" ","ATTRIBUTE5":" ","ATTRIBUTE6":" ","ATTRIBUTE7":" ","ATTRIBUTE8":" ","ATTRIBUTE9":" ","ATTRIBUTE10":" ","TRANSACTION_STATUS":" ","TRANS_STATUS_DESCRIPTION":" "}],"Organization":"PMC Biogenix","SharedSecret":"sTc1QowIu5Iy1Qt8iilnmQ==","TimeStamp":"09/28/2018 00:19:21","RowsSent":"1"}';
      l_amt         integer := dbms_lob.lobmaxsize;
      l_dest_offset integer := 1;
      l_src_offset  integer := 1;
      l_csid        integer := dbms_lob.default_csid;
      l_ctx         integer := dbms_lob.default_lang_ctx;
      l_warn        integer;

    BEGIN

     dbms_lob.createTemporary( l_blob, false );
      dbms_lob.convertToBlob( l_blob,
                              l_clob,
                              l_amt,
                              l_dest_offset,
                              l_src_offset,
                              l_csid,
                              l_ctx,
                              l_warn );

    INSERT INTO PS_ISA_INB_PAYLOAD_LOG Values(ORGANIZATIONNAME,TRANSACTION_TYPE,l_blob,SYSDATE,TRANSACTION_STATUS); 
END SDIX_TICK_LOG;

2 个答案:

答案 0 :(得分:0)

您的问题出在这里:DBMS_LOB.SUBSTR()

DBMS_LOB在内部使用VARCHAR2,并且VARCHAR2的限制为 2000 个字符。您的Blob大小为 2829 个字符,因此太长了,无法被DBMS_LOB.SUBSTR()立即处理。

您可以通过以下命令对此进行测试:

仅从BLOB中获取前 2000 个字符:

 select utl_raw.cast_to_varchar2(dbms_lob.substr(TRANSACTION_DATA), 2000, 1) from PS_ISA_INB_PAYLOAD_LOG;

好。

从BLOB中获取 2001 个字符:

select utl_raw.cast_to_varchar2(dbms_lob.substr(TRANSACTION_DATA, 2001, 1)) from PS_ISA_INB_PAYLOAD_LOG;
  

错误报告-   SQL错误:

     

ORA-06502:PL / SQL:数字或值错误:原始变量长度过长

     

ORA-06512:在第1行

     

06502.00000-“ PL / SQL:数字或值错误%s”

答案 1 :(得分:0)

Is that possible to select entire BLOB Field value?

基本上没有。您将需要一个与您已经描述过的PL / SQL函数类似的功能,除了这次,它将使用BLOB-to-CLOB。如果SQL返回CLOB或VARCHAR2(4000),则可以从SQL调用它。

作为旁注,我质疑您为什么要采用JSON(即字符数据)并将其存储为BLOB,然后想要取回字符数据。为什么不首先将其存储为CLOB?