2016-01-09 3 views
0

Я хотел бы получить значение от функции get_phone(id) и получить ошибку «ORA-06572 функция get_phone имеет аргументы». Я хотел бы знать, как я могу вызвать функцию внутри команды XMLForest?Oracle: вызов функции внутри XMLForest

select XMLElement ("item", XMLForest(a.address AS "address", 
             get_phone(id) AS "mobile") AS "item") from table_example a; 

функция get_phone:

CREATE function get_phone (id IN NUMBER) return NUMBER IS 

mobile := NUMBER; 

BEGIN 
    select emp.mobile 
    into mobile 
    from employees emp 
    where emp.identifier=id; 

return mobile; 

end get_phone; 

Я уже пытался mobile:= get_phone(id) на моем select, но он не работает. Не могли бы вы помочь мне?

+0

'ORA-06572' только выброшенные, когда функция имеет' параметр OUT'. Функция, которую вы задали в вопросе, не имеет параметров 'OUT'. Отправьте функцию, которая сгенерировала ошибку. – MT0

ответ

0

Функция недействительна.

  • Нет BEGIN заявление.
  • Неверное определение mobile.

Попробуйте что-то вроде:

CREATE function get_phone (
    id IN NUMBER 
) return NUMBER 
IS 
    mobile NUMBER; 
BEGIN 
    select emp.mobile 
    into mobile 
    from employees emp 
    where emp.identifier=id; 

    return mobile; 
end get_phone; 
/

После вас рода, что из то должно работать:

select XMLElement (
     "item", 
     XMLForest(
      'address' AS "address", 
      get_phone(1) AS "mobile" 
     ) 
     ) 
from dual; 

Update - Выберите из таблицы, а не DUAL:

CREATE TABLE Employees (mobile, identifier) AS 
SELECT 1234567, 1 FROM DUAL UNION ALL 
SELECT 9876543, 2 FROM DUAL; 

select XMLElement (
     "item", 
     XMLForest(
      'address' AS "address", 
      get_phone(identifier) AS "mobile" 
     ) 
     ) 
from Employees; 

Результаты:

XMLELEMENT("ITEM",XMLFOREST('ADDRESS'AS"ADDRESS",GET_PHONE(IDENTIFIER)AS"MOBILE")) 
---------------------------------------------------------------------------------- 
<item><address>address</address><mobile>1234567</mobile></item> 
<item><address>address</address><mobile>9876543</mobile></item> 
+0

Почему это недействительно? Просто потому, что я забыл поставить CREATE? Это не сработает для меня ... Я уже пробовал ваше решение, оно вернет ошибку, которую я описал. Также обратите внимание, что ваше решение для одной строки, если мой запрос возвращает более одной строки, он не будет работать. – porthfind

+0

Я пошел по вашему вопросу - таблица 'DUAL' вернет только 1 строку, если вы не используете что-то вроде' CONNECT BY'. – MT0

+0

Недопустимо, потому что вы забыли 'CREATE',' BEGIN' и строка, в которой вы определяете переменную 'mobile', является недопустимым синтаксисом. – MT0

Смежные вопросы