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;
我在匿名块中调用此过程,如下所示(从此处下载XML数据:链接(
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 个元素,例如删除一些元素。 这工作正常。
在第一行declare stmt clob := 'INWARDPKG.MACHINEINWARD_VALIDATING...
中,您正在定义您的 CLOB。由于您使用字符串文本来定义 CLOB,因此您将面临字符串文本的限制(请参阅 Oracle 12c 文档(。
要解决您的问题,您必须逐步构建您的 CLOB,使用 DBMS_LOB 包并附加不超过 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;