Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Определить тип значения, возвращаемого функцией PL/SQL  [new]
proxy1
Member

Откуда:
Сообщений: 125
Как можно определить тип значения, возвращаемого функцией PL/SQL?
Что-то гугл ничего путному по этому вопросу не выдает.
В системных вьюхах тоже порылся, но безрезультатно.
Вроде когда-то попадалось мне что-то подобное, но не нужно тогда было, так и забылось.

пример:
function xxx return yyy
интересует тип yyy

Если точнее, то нужно определить, не возвращает ли функция курсор (на тип курсора внимания не обращаем) по известному имени функции.
11 сен 12, 15:00    [13146369]     Ответить | Цитировать Сообщить модератору
 Re: Определить тип значения, возвращаемого функцией PL/SQL  [new]
-2-
Member

Откуда:
Сообщений: 15330
proxy1,

для публичных функций алл_arguments
11 сен 12, 15:06    [13146431]     Ответить | Цитировать Сообщить модератору
 Re: Определить тип значения, возвращаемого функцией PL/SQL  [new]
Shtock
Member

Откуда: СПб
Сообщений: 3049
Оракле нет под рукой - не проверить, но предлагаю ацкое решение - объявить тип anydata, ему присвоить значение, возвращаемое функцией и сделать anydata.gettypename.
11 сен 12, 16:16    [13147175]     Ответить | Цитировать Сообщить модератору
 Re: Определить тип значения, возвращаемого функцией PL/SQL  [new]
proxy1
Member

Откуда:
Сообщений: 125
Очень аццкое! :)
Но: функции вызываются в dynamic sql, единственное, что мы знаем в момент вызова - название функции.
В AnyData нельзя нахрапом валить значение - нужно через функции преобразования. Причем от типа зависит - коллекции, в отличии от простых типов, очень заморочно в него запихивать.
11 сен 12, 16:33    [13147314]     Ответить | Цитировать Сообщить модератору
 Re: Определить тип значения, возвращаемого функцией PL/SQL  [new]
Shtock
Member

Откуда: СПб
Сообщений: 3049
Да, только что сам поковырялся - с первого раза не вышло...
11 сен 12, 16:39    [13147376]     Ответить | Цитировать Сообщить модератору
 Re: Определить тип значения, возвращаемого функцией PL/SQL  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9274
proxy1
Но: функции вызываются в dynamic sql, единственное, что мы знаем в момент вызова - название функции.

И в чем проблема?

SELECT my_func( :param1, :param2...) FROM dual

И потом посмотреть тип возвращаемого столбца. Dbms_sql.describe_columns или как-то так. С результатом запроса точно прокатит, с анонимным pl/sql блоком не уверен.
11 сен 12, 16:48    [13147451]     Ответить | Цитировать Сообщить модератору
 Re: Определить тип значения, возвращаемого функцией PL/SQL  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
Leonid Kudryavtsev
SELECT my_func( :param1, :param2...) FROM dual

И потом посмотреть тип возвращаемого столбца. Dbms_sql.describe_columns или как-то так. С результатом запроса точно прокатит, с анонимным pl/sql блоком не уверен.

Ну-ну... Попробуйте это хотя бы на тривиальной функции, возвращающей boolean осуществить. А уж потом и к более сложным вариантам переходите.

Чем all_arguments не устроил?
11 сен 12, 16:52    [13147480]     Ответить | Цитировать Сообщить модератору
 Re: Определить тип значения, возвращаемого функцией PL/SQL  [new]
proxy1
Member

Откуда:
Сообщений: 125
Bogdanov Andrey
Leonid Kudryavtsev
SELECT my_func( :param1, :param2...) FROM dual

И потом посмотреть тип возвращаемого столбца. Dbms_sql.describe_columns или как-то так. С результатом запроса точно прокатит, с анонимным pl/sql блоком не уверен.

Ну-ну... Попробуйте это хотя бы на тривиальной функции, возвращающей boolean осуществить. А уж потом и к более сложным вариантам переходите.
Чем all_arguments не устроил?

Спасибо, оно самое! :)
(невнимательно я его посмотрел)
11 сен 12, 17:10    [13147595]     Ответить | Цитировать Сообщить модератору
 Re: Определить тип значения, возвращаемого функцией PL/SQL  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8132
-2-
proxy1,
для публичных функций алл_arguments

SELECT data_type
FROM all_arguments
WHERE owner = 'MY_USER'
  AND object_name = 'MY_FUNCTION'
  AND argument_name IS NULL;

SELECT data_type
FROM all_arguments
WHERE object_name = 'MY_FUNCTION'
  AND argument_name IS NULL;
11 сен 12, 17:22    [13147659]     Ответить | Цитировать Сообщить модератору
 Re: Определить тип значения, возвращаемого функцией PL/SQL  [new]
proxy1
Member

Откуда:
Сообщений: 125
SQL*Plus
-2-
proxy1,
для публичных функций алл_arguments

SELECT data_type
FROM all_arguments
WHERE owner = 'MY_USER'
  AND object_name = 'MY_FUNCTION'
  AND argument_name IS NULL;

SELECT data_type
FROM all_arguments
WHERE object_name = 'MY_FUNCTION'
  AND argument_name IS NULL;


да, почти
только:
1) имя функции может иметь формат "СХЕМА.ПАКЕТ.ИМЯ_ФУНКЦИИ" (первые две части не обязательны)
2) интересует именно выходной (по return result) результат, а не передаваемый в одном из параметров
так что примерно так:
select  aa.data_type
from    all_arguments aa
where   substr(upper(:func_name), instr(upper(:func_name), '.', -1) + 1, length(upper(:func_name))) = aa.object_name
        and aa.position = 0
11 сен 12, 17:33    [13147725]     Ответить | Цитировать Сообщить модератору
 Re: Определить тип значения, возвращаемого функцией PL/SQL  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
proxy1
..
так что примерно так:
..

категорически не так.
именно потому, что одноимённые объекты разных схем могут быть доступны в all-arguments,
а также потому, что функции могут быть и пакетированные и непакетированные, и еще одноимённые в разных пакетах да еще и перегруженные.
11 сен 12, 18:49    [13148153]     Ответить | Цитировать Сообщить модератору
 Re: Определить тип значения, возвращаемого функцией PL/SQL  [new]
proxy1
Member

Откуда:
Сообщений: 125
orawish
proxy1
..
так что примерно так:
..

категорически не так.
именно потому, что одноимённые объекты разных схем могут быть доступны в all-arguments,
а также потому, что функции могут быть и пакетированные и непакетированные, и еще одноимённые в разных пакетах да еще и перегруженные.


Согласен, потому и "примерно".
Приведенные вами случаи я учел (в рабочем коде, не здесь), как то:
- проверка на соответствие схемы
- проверка на возможность вхождения функции в пакет.
11 сен 12, 20:34    [13148542]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить