I want to change oracle xmltype node value by my function my_calculator but I can't. See there:
set serveroutput on
declare
w_xml xmltype;
begin
SELECT
XMLQUERY('copy $tmp := .
modify
(for $l3 in $tmp//Line3
return replace value of node $l3 with my_calculator($l3)
)
return $tmp'
PASSING xmltype('<Response><Card>
<Address attr_cust="0">
<Line2>def</Line2>
<Line3>10</Line3>
<Line4>jkl</Line4>
<Line5>mno</Line5>
<Country/>
</Address>
</Card>
<Card>
<Address attr_cust="0">
<Line2>def</Line2>
<Line3>12</Line3>
<Line4>jkl</Line4>
<Line5>mno</Line5>
<Country/>
</Address>
</Card>
</Response>') RETURNING CONTENT)
into w_xml
FROM dual;
dbms_output.put_line( w_xml.extract('/*').getClobVal() );
end;
It return:
Error report -
ORA-19237: XPST0017 - unable to resolve call to function - fn:my_calculator
ORA-06512: at line 5
19237. 00000 - "XPST0017 - unable to resolve call to function - %s:%s"
*Cause: The name and arity of the function call given could not be matched with any in-scope function in the static context.
*Action: Fix the name of the function or the number of parameters to match the list of in-scope functions.
Can I use a user's function in "return replace value of node $l3 with my_calculator($l3)" ? Many thanks.
Because I can not use user function in xquery. So I change my code to use updatexml, It will running ok if the data isn't too large and the DB version in 11,12:
If you want update note value:
If you want update attribue value