2014-10-20 6 views
0
I have This Oracle 12c Procedure 

CREATE OR REPLACE PROCEDURE LOGINCHECK(SQLQRY IN CLOB) 
AS 
    C INTEGER; 
    N INTEGER; 
    RC SYS_REFCURSOR; 
    stmt clob:= To_Clob('begin ' || sqlqry || '; end;'); 
BEGIN 
    C := SYS.DBMS_SQL.OPEN_CURSOR; 
    SYS.DBMS_SQL.PARSE(C,stmt ,DBMS_SQL.native); 
    N := SYS.DBMS_SQL.EXECUTE(C); 
    SYS.DBMS_SQL.GET_NEXT_RESULT(C,RC); 
    SYS.DBMS_SQL.RETURN_RESULT(RC); 
EXCEPTION 
WHEN NO_DATA_FOUND THEN 
    NULL; 
when OTHERS then 
    RAISE; 
END LOGINCHECK; 

Я называю эту процедуру в анонимный блок Like This (Скачать XML-данных здесь: Link)Oracle 12c CLOB тип данных не работает, как ожидалось

declare stmt clob := 'INWARDPKG.MACHINEINWARD_VALIDATING(XMLDOC => XMLTYPE.CREATEXML(paste xml from link))'; --The parameter value is a xml you can download it from above link 
begin 
LOGINCHECK(SQLQRY => STMT); 
end; 

Но я получаю ошибки PLS-00172: Строковый литерал слишком длинный.

Если я уменьшаю размер xml до 40-50 элементов, например удаляю некоторые элементы. это прекрасно работает.

+0

Не уверен, что я вполне понимаю, как вы присваиваете/передавая документ, связанный с. Но это более чем 32 тыс. Символов, поэтому вы не можете назначить его CLOB в виде строкового литерала. Ваша конкатенация внутри процедуры также не сработает. Откуда идет документ? Возможно, вам придется прочитать его где-нибудь в кусках и добавить его в переменную CLOB. –

+0

Я вызываю процедуру logincheck (sqlqry =>) из моего .net-кода, а параметр sqlqry передается из .net вместе с xml-данными, которое составляет около 5 МБ. начало begin_name; строка создается в .net и передается параметру sqlqry. поэтому мне не нужно добавлять clm clm: = To_Clob ('begin' || sqlqry || '; end;'); в logincckck (sqlqry => параметр). также я не могу создать кусок xml. –

+0

Я отправляю sqlqry-параметр как OracleDbType.Clob из .net-кода, но получаю такую ​​же ошибку pls-00172 –

ответ

0

В вашей первой строке declare stmt clob := 'INWARDPKG.MACHINEINWARD_VALIDATING... вы определяете свой CLOB. Поскольку вы используете строковый литерал для определения своего CLOB, вы сталкиваетесь с ограничениями строковых литералов (см. Oracle 12c Documenation).

Чтобы решить вашу проблему, вы должны построить свой CLOB шаг за шагом, используя DBMS_LOB package и добавляя строки длиной не более 4000 байт, пока ваш CLOB не будет завершен.

Основная идея:

DECLARE 
    C CLOB := TO_CLOB('First 4000 bytes'); 
    V VARCHAR2(4000); 
BEGIN 
    V := 'Next 4000 bytes'; 
    DBMS_LOB.WRITEAPPEND(C, LENGTH(V), V); 

    -- more WRITEAPPEND calls until C is complete 

    DBMS_OUTPUT.PUT_LINE('CLOB-Length: ' || DBMS_LOB.GETLENGTH(C)); 
END; 
Смежные вопросы