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