Как правильно использовать oracle EXECUTE IMMEDIATE в этом коде

У меня есть следующий код pl sql, который извлечет значение тега xml и обработает это значение как хранимую функцию, используя оператор 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;

я новый оракул xml. пожалуйста, помогите исправить этот код.


person user5005768Himadree    schedule 08.03.2016    source источник
comment
предоставьте рабочий образец PL/SQL для следующего: output:= pkg_xmltool.function_name(); чтобы было понятно, как должен выглядеть ваш динамический SQL. Кроме того, вы забыли добавить 'BEGIN... END; /' в ваш анонимный блок PL/SQL output   -  person MaxU    schedule 08.03.2016
comment
привет @MaxU, я обновил пост. Спасибо   -  person user5005768Himadree    schedule 08.03.2016


Ответы (1)


Вы должны установить полученное значение в другую переменную PL с INTO после EXECUTE IMMEDIATE.

(объявить функцию xml)

xmlfunction :=  'select pkg_xmltool.'||xml_output||'() from dual';
EXECUTE IMMEDIATE xmlfunction INTO output;
person J. Chomel    schedule 08.03.2016