2012-10-05 20 views
2

我需要一種比varchar2(2000)更大的方式來打印我生成的XML。或者推薦比dbms_output.put_line(x)更好的方法,或者推薦一種不同的數據類型來存儲結果並打印出來。我是Oracle新手,全職工作是UI開發。如何打印由Oracle生成的大型XML字符串?

declare 
    v_ctx dbms_xmlgen.ctxHandle; 
    x varchar2(2000); -- I need something bigger than varchar2(2000) 
begin 
    v_ctx := DBMS_XMLGen.newContext(' 
     select 
      baz as "Baz" 
     from schema.table_with_10000_rows'); 
    DBMS_XMLGen.setRowsetTag(v_ctx, 'Foo'); 
    DBMS_XMLGen.setRowTag(v_ctx, 'Bar'); 
    x := dbms_xmlgen.getxml(v_ctx); 
    dbms_output.put_line(x); 
end; 
+0

我以前去過那裏。原則上,轉換爲BLOB/CLOB似乎很好,但實際上,我們在堆棧的各個層次都遇到了各種問題:OCI段錯誤,無聲截斷,字符集問題。我希望別人有一個好的解決方案。 – willglynn

回答

2

您需要使用CLOB,如果你有超過4000個字符,這是該數據類型getxml回報。 This question似乎正在接近相同的問題,並顯示了一個簡單的方法來循環和打印塊,雖然它有一個缺陷 - 它應該使用dbms_output.put()而不是put_line(編輯:也許與循環後終端dbms_output.new_line;未經測試我'我害怕)。

如果你在SQL做這個*另外,你可以完全避免使用一個dbms_outputclient bind variable

var x clob; 

declare 
    v_ctx dbms_xmlgen.ctxHandle; 
begin 
    v_ctx := DBMS_XMLGen.newContext(' 
     select table_name as "Baz" 
     from all_tables'); 
    DBMS_XMLGen.setRowsetTag(v_ctx, 'Foo'); 
    DBMS_XMLGen.setRowTag(v_ctx, 'Bar'); 
    :x := dbms_xmlgen.getxml(v_ctx); 
end; 
/

print x 

x聲明的PL/SQL塊外,並用withing它作爲一個綁定變量 - 記在作業中冒號:x := ...

X 
-------------------------------------------------------------------------------- 
<?xml version="1.0"?> 
<Foo> 
<Bar> 
    <Baz>DUAL</Baz> 
</Bar> 
<Bar> 
    <Baz>SYSTE 

默認情況下,您可能只會看到XML的開始;你需要set long <some big number>才能看到這一切,並且(從11g開始)你僅限於2GB。 (我想你也會想要設置反饋和標題,也許會很長)。


爲什麼你打印它雖然屏幕這樣的,而不是在一個表中存儲我會質疑。如果最終目標是將其存入文件中,utl_file可能更合適;也許像this

+0

剛剛看到你的答案。將嘗試今天或明天並可能標記爲答案。似乎它應該工作。謝謝。 –

+0

@JohnZabroski - 思考一下,如果你剛剛在鏈接到的問題中使用了'dbms_output.put',你將得不到或不完整的輸出;我想你在循環之後還需要'dbms_output.new_line'。您也可能有緩衝區大小問題。你是從SQL * Plus執行此操作嗎?如果是這樣的話,可能有不同的方法... –

+0

我正在從SQL Navigator執行此操作。我是一名UI開發人員。我曾經用SQL Server做過DBA類型的東西,但不是Oracle。 5年或6年前在大學裏參加過Oracle課程。 –