2016-03-08 58 views
1

我有以下的PL SQL代碼,將提取XML標記值,並使用甲骨文的EXECUTE IMMEDIATE語句把該值作爲存儲功能:如何corrrectly使用Oracle在這個代碼中執行即時

該代碼會發現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; 

IAM新的Oracle XML。請幫助更正此代碼。

+1

請提供PL/SQL的以下工作示例:'輸出:= pkg_xmltool.function_name();'所以,這將是明顯的動態SQL應該是什麼樣子喜歡。除此之外,你忘了添加'BEGIN ... END; /'到你的匿名PL/SQL塊'輸出' – MaxU

+0

hi @MaxU,我已經更新了這篇文章。謝謝 – user5005768

回答

1

您必須在EXECUTE IMMEDIATE後用INTO將結果值設置爲另一個PL變量。

(聲明xmlfunction)

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