字符串文字长度超过4000个字符

时间:2018-05-31 06:18:41

标签: string oracle oracle11g varchar clob

我有一个基本上使用XML作为输入的函数,并执行下一步。

我从一个语句传递XML但是它给出了错误

"字符串文字超过4000个字符"

功能

create or replace FUNCTION F_ADD_TEST(P_XML_DATA CLOB) RETURN NUMBER AS
xmlContent xmlType;
RESP_XML XMLTYPE;

o xmlType;
c xmlType;


BEGIN
--xmlContent := xmlType(xmlData);
raise_application_error('-20003',P_XML_DATA);
-- Further steps


RETURN 1;
END F_ADD_TEST;

声明

Select F_ADD_TEST('<?xml version="1.0" encoding="UTF-8"?>
<SyncReceiveDelivery xmlns:ln="http://schema.infor.com/InforOAGIS/2">
    <DataArea>
        <ReceiveDelivery>
            <ReceiveDeliveryHeader>
                <DocumentID>
                    <ID>100_ZHA005270</ID>
                </DocumentID>
            <WarehouseLocation>
                <ID>W_ZHF12S</ID>
            </WarehouseLocation>
        </ReceiveDeliveryHeader>
        <ReceiveDeliveryItem>
            <LineNumber>10</LineNumber>
            <ItemID>
                <ID>24101600PA02435</ID>
                <RevisionID>S000</RevisionID>
            </ItemID>
            <ReceivedQuantity>1</ReceivedQuantity>
            <ServiceOrder>KRH000033</ServiceOrder>
        </ReceiveDeliveryItem>
        <ReceiveDeliveryItem>
            <LineNumber>20</LineNumber>
            <ItemID>
                <ID>24101600PA04407</ID>
                <RevisionID>S000</RevisionID>
            </ItemID>
            <ReceivedQuantity>4</ReceivedQuantity>
            <ServiceOrder>KRH000033</ServiceOrder>
        </ReceiveDeliveryItem>
    </ReceiveDelivery>
</DataArea>
</SyncReceiveDelivery>') from dual;

如果XML内容很大,我会收到错误

&#34;字符串文字超过4000个字符&#34;

我已将数据类型从Varchar更改为clob但仍然相同。请帮帮我。

1 个答案:

答案 0 :(得分:0)

在SQL中,'a value'是文本文字和the documentation状态:

  

文本文字具有CHARVARCHAR2数据类型的属性:

     
      
  • 在表达式和条件中,Oracle将文本文字视为具有数据类型CHAR,方法是使用空白填充的比较语义对它们进行比较。

  •   
  • 文本文字的最大长度为4000字节。

  •   

所以你的代码是:

SELECT SOME_FUNCTION( 'A text literal which cannot be more than 4000 bytes' ) FROM DUAL

如果你想在SQL中的字符串中有超过4000个字节,那么你不能使用文本文字,并且必须通过绑定参数(使用PL / SQL或其他语言/中间件)或其他东西传入CLOB比如修改代码以获取文件名并从文件加载XML。

SELECT F_ADD_TEST( :bindparameter ) FROM DUAL;