barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 30 марта 2012 г.

Вызов хранимой функции и вывод её результатов в консоль в Oracle

Меня, как человека с полным отсутствием опыта работы с ораклом, и привыкшего к MySQL или, в крайнем случае, к Postgres, задача вызова хранимой функции поставила поначалу в тупик. Сделать, как в MySQL:
SELECT myf("blablabla")
в оракле нельзя. Времени читать документацию или книжки не было (хотя надо будет когда-нибудь обязательно освоить оракл, но не сейчас), поэтому я, немного погуглив и поэкспериментировав, нашел такой вариант:
SET SERVEROUTPUT ON;
declare
result VARCHAR2(100);
begin
result := myf("blablabla");
DBMS_OUTPUT.ENABLE;
dbms_output.put_line(result);
end;
Т.е. объявляем анонимный блок, записываем результат выполнения функции в переменную, а потом печатаем её с помощью dbms_output.

5 комментариев:

  1. Хм, а почему в Oracle нельзя применить Ваш первый вариант?

    Я вот попробовал только что,
    select <> from dual очень прекрасно отрабатывает.

    ОтветитьУдалить
  2. select имя функции (значение входного параметра) from dual
    А то почему-то обрезал браузер в первом комменте.

    ОтветитьУдалить
    Ответы
    1. Здесь ключевое отличие от моего варианта - "from dual", а я пробовал без "from" вообще, в MySQL так можно. И когда у меня не получилось, полез в какие-то дебри, Ваш вариант конечно проще, чем мой)

      Удалить
  3. а вот кстати:
    Присоединен к:
    Oracle Database 11g Release 11.2.0.1.0 - 64bit Production

    SQL> SET SERVEROUTPUT ON;
    SQL> declare res_ NUMBER;
    2 begin
    3 res_ := flak_checkinn(1, '111');
    4 DBMS_OUTPUT.ENABLE;
    5 dbms_output.put_line(res_);
    6 end;
    7
    8 ;
    9 ;
    что нужно нажать, что бы запустить на исполнение-то? )))
    вариант с from daul - просто рулит и педалит )))

    ОтветитьУдалить
    Ответы
    1. select from dual рулит для удаленного вызова функции только если запрос (хранимая функция + параметры) меньше 30 символов. Иначе можно схлопотать сообщение об ошибке ORA-00972. Если длина вызова более, то только через создание анонимного блока, как в топике.

      Удалить