你的程序的說法是XMLTYPE,它會自動編碼單引號和雙引號,從predefined XML entities list
SQL> select xmltype('<test>6''4"</test>') from dual;
XMLTYPE('<TEST>6''4"</TEST>')
--------------------------------------------------------------------------------
<test>6'4"</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'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
感謝您的幫助。 這是我們如何從XML中檢索名稱。 (),(1),(200),(3),(4),(4) 然後使用該變量名稱來更新/插入。我始終覺得最好將未編碼的數據存儲在數據庫中,並在顯示之前進行編碼。 – frmrock164
有沒有辦法改變存儲過程來存儲未編碼的數據? – frmrock164
該過程如何將數據存儲爲CLOB列,將數據從XML中提取出來放入關係表中,作爲簡單插入到XMLType列中的數據?如果它是一個XMLType列,那麼存儲編碼實體是正確的,並且在查詢/提取時需要解碼它們。否則,您可以在將XML數據轉換爲CLOB或關係列時將其解碼。 –