有這個功能:
CREATE OR REPLACE FUNCTION get_seq_xi_pl9_wws2lvs
RETURN NUMBER
IS
BEGIN
RETURN seq_xi_pl9_wws2lvs.NEXTVAL;
END get_seq_xi_pl9_wws2lvs;
并使用此示例查詢:
SELECT id,
''
|| XMLELEMENT ("Request",
XMLELEMENT ("TransaktionsNr",
id),
XMLELEMENT ("Zeitstempel",
0),
(SELECT xmldaten
FROM DUAL)) AS xml_final
FROM (SELECT id,
xmldaten
FROM (SELECT get_seq_xi_pl9_wws2lvs AS id,
(XMLELEMENT ("Bestellung",
XMLELEMENT ("BestellNr",
tmp_bsp.BestellNr))) AS xmlDaten
FROM (SELECT 4711 AS BestellNr
FROM DUAL
UNION ALL
SELECT 4712 AS BestellNr
FROM DUAL) tmp_bsp));
這是輸出:
| ID | XML_FINAL |
|---|---|
| 347816 | <Request><TransaktionsNr>347817</TransaktionsNr><Zeitstempel>0</Zeitstempel><Bestellung><BestellNr>4711</BestellNr></Bestellung></Request> |
| 347818 | <Request><TransaktionsNr>347819</TransaktionsNr><Zeitstempel>0</Zeitstempel><Bestellung><BestellNr>4712</BestellNr></Bestellung></Request> |
在一行中,欄位“ID”和 XmlElement“TransaktionsNr”(也有“ID”作為值)具有不同的值 - 我希望它們是相同的。
我究竟做錯了什么?
uj5u.com熱心網友回復:
SQL 引擎選擇不實作子查詢,并將函式呼叫推送到外部查詢中,在該外部查詢中,每行都會多次呼叫它。您需要強制在呼叫它的子查詢中評估該函式,而不是允許 SQL 引擎重寫查詢。
一種方法是使用帶有具體化提示的子查詢分解子句:
WITH data (bestellnr) AS (
SELECT 4711 AS BestellNr FROM DUAL
UNION ALL
SELECT 4712 AS BestellNr FROM DUAL
),
ids (id, bestellnr) AS (
SELECT /* materialize */
get_seq_xi_pl9_wws2lvs,
bestellnr
FROM data
)
SELECT id,
XMLELEMENT (
"Request",
XMLELEMENT ("TransaktionsNr", id),
XMLELEMENT ("Zeitstempel", 0),
XMLELEMENT(
"Bestellung",
XMLELEMENT ("BestellNr", BestellNr)
)
).getStringVal() AS xml_final
FROM ids;
哪個輸出:
ID XML_FINAL 1 <Request><TransaktionsNr>1</TransaktionsNr><Zeitstempel>0</Zeitstempel><Bestellung><BestellNr>4711</BestellNr></Bestellung></Request> 2 <Request><TransaktionsNr>2</TransaktionsNr><Zeitstempel>0</Zeitstempel><Bestellung><BestellNr>4712</BestellNr></Bestellung></Request>
如果您不想使用提示,那么您可以添加(看似無用的)過濾器WHERE ROWNUM >= 1,這也將強制 SQL 引擎在該點具體化查詢。
SELECT id,
XMLELEMENT (
"Request",
XMLELEMENT ("TransaktionsNr", id),
XMLELEMENT ("Zeitstempel", 0),
XMLELEMENT(
"Bestellung",
XMLELEMENT ("BestellNr", BestellNr)
)
).getStringVal() AS xml_final
FROM (
SELECT get_seq_xi_pl9_wws2lvs AS id,
bestellnr
FROM (
SELECT 4711 AS BestellNr FROM DUAL UNION ALL
SELECT 4712 AS BestellNr FROM DUAL
)
WHERE ROWNUM >= 1
);
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/455872.html
