2015-04-27 71 views
0

我正在研究爲什麼我們要在我們的數據庫中獲得一些編碼數據。Oracle Stored Proc插入編碼數據

我發現我們使用的網格是將一些HTML編碼添加到傳遞給存儲過程的xml數據。

但是,我關閉了數據表中的html編碼,並確認我們正在將未編碼的數據發送到數據庫。然而,插入/更新數據的存儲過程似乎仍然是編碼單引號。

我沒有看到存儲過程中的任何東西,它說要編碼數據。是否有設置或其他可以用XML發送的東西可能導致這種情況。

CREATE OR REPLACE PROCEDURE spSample (ncoXml IN XMLTYPE) 
IS 

xml正在用utf-8編碼發送。我猜這是問題。

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 

感謝您的任何幫助或建議,你可以給。

回答

1

你的程序的說法是XMLTYPE,它會自動編碼單引號和雙引號,從predefined XML entities list

SQL> select xmltype('<test>6''4"</test>') from dual; 

XMLTYPE('<TEST>6''4"</TEST>') 
-------------------------------------------------------------------------------- 
<test>6&apos;4&quot;</test> 

這是無關的HTML;其他非XML HTML entities未編碼。你所看到的是正確的;實體應該在您的XMLType對象中進行編碼。

如果你想看到的解碼實體可以使用過時extractvalue功能:

SQL> select extractvalue(xmltype('<test>6''4"</test>'), '/test') from dual; 

EXTRACTVALUE(XMLTYPE('<TEST>6''4"</TEST>'),'/TEST') 
-------------------------------------------------------------------------------- 
6'4" 

或XMLQuery一樣,與XMLCAST做解碼,當轉換到普通字符串的一部分:

SQL> select xmlcast(xmlquery('/test/text()' passing xmltype('<test>6''4"</test>') 
    2 returning content) as varchar2(10)) from dual; 

XMLCAST(XM 
---------- 
6'4" 

根據您如何使用你的程序中的數據,您可以使用extract()xmlcast(xmlquery(...) as ...)改變形式。你不能在PL/SQL中原生地調用它(據我所知),所以你需要一個上下文切換來從雙重選擇;並且它似乎並不喜歡連接命令內的索引值 - 不太清楚爲什麼,但我不得不使用變量來保存構建的XPath。

舉個例子,如果你有類似這樣的東西 - 與正在傳遞給你的程序在你的真實情況下的價值觀 - 你仍然有編碼值:

DECLARE 
    ncoXml XMLType := XMLType(q'[<victims><victim index="1"><name>Peter O'Toole</name></victim></victims>]'); 
    victimIndex pls_integer := 1; 
    victimName varchar2(200); 
BEGIN 
    victimName := SUBSTR(ncoXml.EXTRACT('/victims/victim[@index="' 
    || TO_CHAR(victimIndex) || '"]/name/text()').GETSTRINGVAL(), 1, 200); 
    dbms_output.put_line(victimName); 
END; 
/

Peter O&apos;Toole 

而一個XMLCAST變異可能看起來像:

DECLARE 
    ncoXml XMLType := XMLType(q'[<victims><victim index="1"><name>Peter O'Toole</name></victim></victims>]'); 
    victimIndex pls_integer := 1; 
    victimName varchar2(200); 
    xPath varchar2(200); 
BEGIN 
    xPath := '/victims/victim[@index="' || victimIndex || '"]/name/text()'; 
    select xmlcast(xmlquery(xPath passing ncoXml returning content) as varchar2(200)) 
    into victimName 
    from dual; 
    dbms_output.put_line(victimName); 
END; 
/

Peter O'Toole 
+0

感謝您的幫助。 這是我們如何從XML中檢索名稱。 (),(1),(200),(3),(4),(4) 然後使用該變量名稱來更新/插入。我始終覺得最好將未編碼的數據存儲在數據庫中,並在顯示之前進行編碼。 – frmrock164

+0

有沒有辦法改變存儲過程來存儲未編碼的數據? – frmrock164

+0

該過程如何將數據存儲爲CLOB列,將數據從XML中提取出來放入關係表中,作爲簡單插入到XMLType列中的數據?如果它是一個XMLType列,那麼存儲編碼實體是正確的,並且在查詢/提取時需要解碼它們。否則,您可以在將XML數據轉換爲CLOB或關係列時將其解碼。 –