2014-10-20 72 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; 

我(从这里下载XML数据:Link)调用这个过程中匿名块像这样甲骨文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

不知道我很明白你是如何分配/传递您链接到文档。但是,这是超过32k个字符,因此您不能将它作为字符串文字分配给CLOB。程序中的连接也会失败。文件来自哪里?您可能需要从块中的某处读取它并将其附加到CLOB变量。 – 2014-10-20 10:30:11

+0

我从我的.net代码调用logincheck(sqlqry => parameter)过程,并将sqlnet参数从.net传递到大约5 MB的xml数据。 begin procedure_name结束;字符串在.net中创建并传递给sqlqry参数。因此我不需要添加stmt clob:= To_Clob('begin'|| sqlqry ||'; end;');在logincheck(sqlqry =>参数)。我也无法创建大块的XML。 – 2014-10-20 10:50:04

+0

我从.net代码发送sqlqry参数为OracleDbType.Clob,但得到相同的pls-00172错误 – 2014-10-20 11:06:47

回答

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;