Строковый литерал длиннее 4000 символов - PullRequest
0 голосов
/ 31 мая 2018

У меня есть одна функция, которая в основном использует 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 огромно. Я получаю сообщение об ошибке

«Строковый литерал длиннее 4000 символов»

Я изменил тип данных с Varchar на clob, но все тот же.Пожалуйста, помогите мне в этом.

1 Ответ

0 голосов
/ 31 мая 2018

В SQL 'a value' является текстовым литералом, а документация гласит:

Текстовые литералы имеют свойства типов данных CHAR и VARCHAR2:

  • В выражениях и условиях Oracle обрабатывает текстовые литералы, как если бы они имели тип данных CHAR, сравнивая их с использованием семантики сравнения с пробелами.

  • Текстовый литерал может иметь максимальную длину 4000 байтов.

Итак, ваш код:

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

Если вы хотите иметь более 4000байтов в строке в SQL, тогда вы не можете использовать текстовый литерал, и вам придется передавать CLOB через параметр связывания (либо с использованием PL / SQL, либо другого языка / промежуточного программного обеспечения), либо что-то вроде изменения кода для получения имени файла и загрузкиXML из файла.

SELECT F_ADD_TEST( :bindparameter ) FROM DUAL;
...