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

Откуда:
Сообщений: 85
Только только начал осваивать Oracle. Уже разобрался как функций получить массив данных (cast и т.п.)
Но вот как получить из функции всего одну строку, состоящую из нескольких полей, без использования двух типов и т.п. конструкций.

Наваял вот:

create or replace type func_result as object
(
  retval   NUMBER,
  retstr   VARCHAR(255),
  retother VARCHAR(10)
);

create OR replace function f_01
  ( 
    v1   NUMBER,
    v2   NUMBER
   ) 
RETURN func_result
IS
retval2 func_result;
begin
  
  retval2.retval:=v1*v2;  
  retval2.retstr:='проверка';
  retval2.retother:='дополнительное поле';

  return(retval2);
end f_01;



Но как теперь вызвать f_01???
25 июн 10, 11:04    [9000469]     Ответить | Цитировать Сообщить модератору
 Re: Получить набор из функции.  [new]
Добрый Э - Эх
Guest
Курсор(select) из хранимых процедур, функций
Запрос из функции
Запрос из функции 2
25 июн 10, 11:08    [9000499]     Ответить | Цитировать Сообщить модератору
 Re: Получить набор из функции.  [new]
AlexFF__|
Member

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

Просто взять и вызвать.
Только объекты надо инициализировать.
А зачем return обернут в скобочки?)
25 июн 10, 11:08    [9000500]     Ответить | Цитировать Сообщить модератору
 Re: Получить набор из функции.  [new]
BlackSmoke
Member

Откуда:
Сообщений: 85
to 'Добрый Э - Эх ' с наборами то я уже разобрался, но мне надо получить ОДНУ запись
to 'AlexFF__|' вот как так "взять и вызвать"?
SELECT * FROM TABLE (CAST(f_01(2,2) AS func_result)) как с наборами, не подходит.

скобочки PL/SQL Developer ставит.
25 июн 10, 11:24    [9000608]     Ответить | Цитировать Сообщить модератору
 Re: Получить набор из функции.  [new]
BlackSmoke
Member

Откуда:
Сообщений: 85
быть может возвращаемый тип определять как RECORD, но тогда его не сделаешь отдельным типом, а он нужен будет во многих функциях
25 июн 10, 11:27    [9000633]     Ответить | Цитировать Сообщить модератору
 Re: Получить набор из функции.  [new]
AmKad
Member

Откуда:
Сообщений: 5222
BlackSmoke
быть может возвращаемый тип определять как RECORD, но тогда его не сделаешь отдельным типом, а он нужен будет во многих функциях

create or replace package my_types
is
    type t_record is record 
    (id number,
     first_name varchar2(100)
    );
end;

declare
loRecord my_types.t_record; 
begin
    loRecord.id := 1;
    loRecord.first_name := 'BlackSmoke';
end;
25 июн 10, 11:36    [9000709]     Ответить | Цитировать Сообщить модератору
 Re: Получить набор из функции.  [new]
Добрый Э - Эх
Guest
BlackSmoke
to 'Добрый Э - Эх ' с наборами то я уже разобрался, но мне надо получить ОДНУ запись
to 'AlexFF__|' вот как так "взять и вызвать"?
SELECT * FROM TABLE (CAST(f_01(2,2) AS func_result)) как с наборами, не подходит.

скобочки PL/SQL Developer ставит.


Что в твоем понимании "одна запись"?

explain plan for select * from dual union all select * from dual

Processing ...

select * from table(dbms_xplan.display)

Query finished, retrieving results...

                                PLAN_TABLE_OUTPUT                                
-------------------------------------------------------------------------------- 
Plan hash value: 716948595                                                       
                                                                                 
---------------------------------------------------------------------------      
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |      
---------------------------------------------------------------------------      
|   0 | SELECT STATEMENT   |      |     2 |     4 |     4  (50)| 00:00:01 |      
|   1 |  UNION-ALL         |      |       |       |            |          |      
|   2 |   TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |      
|   3 |   TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |      
---------------------------------------------------------------------------      

10 row(s) retrieved

Processing ...

select * from table(dbms_xplan.display) where rownum = 1

Query finished, retrieving results...
                                PLAN_TABLE_OUTPUT                                
-------------------------------------------------------------------------------- 
Plan hash value: 716948595

1 row(s) retrieved
25 июн 10, 11:36    [9000711]     Ответить | Цитировать Сообщить модератору
 Re: Получить набор из функции.  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
BlackSmoke,

create or replace type func_result as object
(
  retval   NUMBER,
  retstr   VARCHAR(255),
  retother VARCHAR(10)
);

create or replace function f_01
  (
    v1   NUMBER,
    v2   NUMBER
   )
RETURN func_result
IS
retval2 func_result;
begin

  retval2 := func_result(v1*v2, 'проверка', 'доп. поле');

  return(retval2);
end f_01;
select f_01(3,2) from dual;
25 июн 10, 11:50    [9000836]     Ответить | Цитировать Сообщить модератору
 Re: Получить набор из функции.  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
__vvp_
BlackSmoke,

select f_01(3,2) from dual;


Вдогонку:
select treat(f as func_result).retval retval,
       treat(f as func_result).retstr retstr,
       treat(f as func_result).retother retother
from (select f_01(3,2) f from dual);
25 июн 10, 11:54    [9000870]     Ответить | Цитировать Сообщить модератору
 Re: Получить набор из функции.  [new]
BlackSmoke
Member

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

вот это то, что надо, спасиб!

Только я всеравно не понял почему если присваивать значения так:
  retval2.retval:=v1*v2;  
  retval2.retstr:='проверка';
  retval2.retother:='дополнительное поле';

то выборка не получается, а если retval2 := func_result(v1*v2, 'проверка', 'доп. поле'), то работает.
25 июн 10, 12:02    [9000948]     Ответить | Цитировать Сообщить модератору
 Re: Получить набор из функции.  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
BlackSmoke
__vvp_,

Только я всеравно не понял почему если присваивать значения так:
  retval2.retval:=v1*v2;  
  retval2.retstr:='проверка';
  retval2.retother:='дополнительное поле';

то выборка не получается, а если retval2 := func_result(v1*v2, 'проверка', 'доп. поле'), то работает.


Тут знать надо
25 июн 10, 12:21    [9001149]     Ответить | Цитировать Сообщить модератору
 Re: Получить набор из функции.  [new]
mmar
Member

Откуда: -)
Сообщений: 391
BlackSmoke

Только я всеравно не понял почему если присваивать значения так:
  retval2.retval:=v1*v2;  
  retval2.retstr:='проверка';
  retval2.retother:='дополнительное поле';
то выборка не получается, а если retval2 := func_result(v1*v2, 'проверка', 'доп. поле'), то работает.

что значит "не получается"? Если вы так назвали ексепшн, то выше написали уже - объекты нужно инициализировать.
25 июн 10, 14:35    [9002525]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить