如何在此代码中正确使用 oracle EXECUTE IMMEDIATE

Posted

技术标签:

【中文标题】如何在此代码中正确使用 oracle EXECUTE IMMEDIATE【英文标题】:How to corrrectly use oracle EXECUTE IMMEDIATE in this code 【发布时间】:2016-03-08 09:55:29 【问题描述】:

我有以下 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(),它将返回值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;

我是新的 oracle xml。请帮助更正此代码。

【问题讨论】:

请为以下内容提供 PL/SQL 的工作示例:output:= pkg_xmltool.function_name();,以便清楚您的动态 SQL 应该是什么样子。除此之外,您忘记添加 'BEGIN ... END; /' 到你的匿名 PL/SQL 块 output 嗨@MaxU,我已经更新了帖子。谢谢 【参考方案1】:

您必须在 EXECUTE IMMEDIATE 之后使用 INTO 将结果值设置到另一个 PL 变量中。

(声明xml函数)

xmlfunction :=  'select pkg_xmltool.'||xml_output||'() from dual';
EXECUTE IMMEDIATE xmlfunction INTO output;

【讨论】:

以上是关于如何在此代码中正确使用 oracle EXECUTE IMMEDIATE的主要内容,如果未能解决你的问题,请参考以下文章

Oracle APEX 4.2 经典报告中的自定义搜索

如何在 Oracle 11g 中正确使用 MEMBER OF 函数

如何在此自定义堆栈实现中正确分配更多内存?

如何在此框架中正确使用继承

如何在此数据框列的 R 中正确使用 apply?

在此示例中,如何使用 docker-compose 允许 2 个容器正确共享 .sock 文件?