如何在此代码中正确使用 oracle EXECUTE IMMEDIATE
How to corrrectly use oracle EXECUTE IMMEDIATE in this code
我有以下 pl sql 代码,它将提取一个 xml 标记值并使用 oracle 的 EXECUTE IMMEDIATE 语句将该值视为存储函数:
此代码将找到 xml 标记 <function>
并提取其值 'get_val'(它本身是一个存储函数)并将调用此函数:
DECLARE
xml_output VARCHAR2(5000);
output VARCHAR2(5000);
--sourceXML VARCHAR2(5000);
matchingXML VARCHAR2(5000);
childtag VARCHAR2(100);
childval VARCHAR2(100);
sourceXML xmltype;
BEGIN
sourceXML := xmltype('<Payheads>
<All>
<P>
<code>2</code>
<function>get_val</function>
<param>1</param>
<amount></amount>
<source>source>
</P>
</All>
</Payheads>');
childtag := 'function';
SELECT EXTRACTVALUE(sourceXML, '//'||childtag) AS into xml_output FROM SYS.DUAL;
output := 'pkg_xmltool'||'.'||xml_output||'()';
EXECUTE IMMEDIATE output;
if (output is not null)then
dbms_output.put_line(output);
elsif (output is null)then
dbms_output.put_line('null');
end if;
END;
在上面的代码中
output := 'pkg_xmltool'||'.'||xml_output||'()';
我想用下面的方式来评价这个:
output := pkg_xmltool.get_val()
这将调用函数 get_val()
,它将 return 值 100 输出。
在这里,这是 get_val
函数体:
FUNCTION get_val return float IS ret float;
v_code NUMBER;
v_errm VARCHAR2(500);
BEGIN
ret := 100;
if (ret is not null)then
RETURN ret;
elsif (ret is null)then
RETURN null;
end if;
EXCEPTION
WHEN OTHERS THEN
v_code := SQLCODE;
v_errm := SUBSTR(SQLERRM, 1 , 500);
--DBMS_OUTPUT.PUT_LINE('Error code ' || v_code || ': ' || v_errm);
RETURN '<result><status>Error'||v_errm||'</status></result>';
END get_val;
我是新甲骨文 xml。请帮助更正此代码。
您必须在 EXECUTE IMMEDIATE 之后使用 INTO 将结果值设置到另一个 PL 变量中。
(声明 xml 函数)
xmlfunction := 'select pkg_xmltool.'||xml_output||'() from dual';
EXECUTE IMMEDIATE xmlfunction INTO output;
我有以下 pl sql 代码,它将提取一个 xml 标记值并使用 oracle 的 EXECUTE IMMEDIATE 语句将该值视为存储函数:
此代码将找到 xml 标记 <function>
并提取其值 'get_val'(它本身是一个存储函数)并将调用此函数:
DECLARE
xml_output VARCHAR2(5000);
output VARCHAR2(5000);
--sourceXML VARCHAR2(5000);
matchingXML VARCHAR2(5000);
childtag VARCHAR2(100);
childval VARCHAR2(100);
sourceXML xmltype;
BEGIN
sourceXML := xmltype('<Payheads>
<All>
<P>
<code>2</code>
<function>get_val</function>
<param>1</param>
<amount></amount>
<source>source>
</P>
</All>
</Payheads>');
childtag := 'function';
SELECT EXTRACTVALUE(sourceXML, '//'||childtag) AS into xml_output FROM SYS.DUAL;
output := 'pkg_xmltool'||'.'||xml_output||'()';
EXECUTE IMMEDIATE output;
if (output is not null)then
dbms_output.put_line(output);
elsif (output is null)then
dbms_output.put_line('null');
end if;
END;
在上面的代码中
output := 'pkg_xmltool'||'.'||xml_output||'()';
我想用下面的方式来评价这个:
output := pkg_xmltool.get_val()
这将调用函数 get_val()
,它将 return 值 100 输出。
在这里,这是 get_val
函数体:
FUNCTION get_val return float IS ret float;
v_code NUMBER;
v_errm VARCHAR2(500);
BEGIN
ret := 100;
if (ret is not null)then
RETURN ret;
elsif (ret is null)then
RETURN null;
end if;
EXCEPTION
WHEN OTHERS THEN
v_code := SQLCODE;
v_errm := SUBSTR(SQLERRM, 1 , 500);
--DBMS_OUTPUT.PUT_LINE('Error code ' || v_code || ': ' || v_errm);
RETURN '<result><status>Error'||v_errm||'</status></result>';
END get_val;
我是新甲骨文 xml。请帮助更正此代码。
您必须在 EXECUTE IMMEDIATE 之后使用 INTO 将结果值设置到另一个 PL 变量中。
(声明 xml 函数)
xmlfunction := 'select pkg_xmltool.'||xml_output||'() from dual';
EXECUTE IMMEDIATE xmlfunction INTO output;