如何在此代码中正确使用 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;