powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование функции в select
16 сообщений из 16, страница 1 из 1
Использование функции в select
    #32125575
andsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли результат функции, возвращающей ref cursor, использовать в select? Что-то вроде select * from FunctionName(1,2,3) ?
...
Рейтинг: 0 / 0
Использование функции в select
    #32125585
Фотография shane54
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно (и нужно) так:

Код: plaintext
select FunctionName( 1 ,  2 ,  3 ) from dual;


Через ODAC/DOA/ADO результирующий курсор можно юзать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
Query.First
while NOT Query.EoF do
   begin
      Query.Fields.Field[i].AsТип бла-бла-бла;         // Это  2  варианта
      Query.Fields.FieldByName('имя') бла-бла-бла;  // одного и того же
      Query.Next
   end;
...
Рейтинг: 0 / 0
Использование функции в select
    #32125586
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
DROP TYPE pages_object;
DROP TYPE pages_table;
DROP FUNCTION GetPagesCursor;

CREATE TYPE pages_object AS OBJECT
(
 page_serial NUMBER( 16 ),
 name VARCHAR2( 15 ),
 page_file VARCHAR2( 255 ),
 sequritylevel NUMBER( 3 ),
 uses NUMBER( 16 )
 );

CREATE TYPE pages_table AS TABLE OF pages_object;

CREATE OR REPLACE FUNCTION GetPagesCursor RETURN pages_table IS

 CURSOR c_pages IS
  SELECT page_serial, UPPER(name), pagefile, securitylevel, uses FROM pages;

 v_pages pages%ROWTYPE;
 t_pages pages_table := pages_table();
 n INTEGER:= 0 ;
BEGIN
 FOR v_pages IN c_pages LOOP
  n:=n+ 1 ;
  t_pages.EXTEND;
  t_pages(n):=v_pages;
 END LOOP;
RETURN t_pages;
END GetPagesCursor;


 -- Использование
 
SELECT
  page_serial,
  name
FROM
TABLE( CAST(GetPagesCursor() AS pages_table));
...
Рейтинг: 0 / 0
Использование функции в select
    #32125600
andsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробую использовать:
select agency.bvd.get_balance_by_agency_with_op(null,'1.12.2001', 19344, null, 1, 0) from dual
В ответ пишет: ORA-00902, invalid datatype
В чем тут дело? Функция get_balance_by_agency_with_op в пакете BVD в схеме agency возвращает ref cursor.

И еще. Обязятельно ли обьявлять тип 'Create Type' или все же можно не обьявлять?
...
Рейтинг: 0 / 0
Использование функции в select
    #32125616
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция должна возвращать один из типов данных sql-сервера (varchar2, number, date). ref cursor таковым не является. Не путайте типы данных PL/SQL и SQL.
...
Рейтинг: 0 / 0
Использование функции в select
    #32125630
andsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новая попытка.

select * from table(cast(Agency.get_balance_by_unit_with_op(377,'1.12.2001') as bvd_stock_table_type));

Пишет: ORA-22905, cannot access rows from a non-nested table item.

Функция возвращает bvd_stock_table_type.
Тут в чем дело?
...
Рейтинг: 0 / 0
Использование функции в select
    #32125705
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты не правильно используешь типы.
Ты используешь непосредственно тип,который описывает таблицу( применительно к моему примеру pages_object), а нужно применять тип pages_table.
...
Рейтинг: 0 / 0
Использование функции в select
    #32126411
lilo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мне тоже захотелось так попробовать
но на строке
t_pages(n):=v_pages;
пишет ошибку - выражение неправильного типа
...
Рейтинг: 0 / 0
Использование функции в select
    #32126415
lilo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня девятка
Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production
...
Рейтинг: 0 / 0
Использование функции в select
    #32126424
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты знаешь, именно в 9i - не получается. В 8 и 8i замечательно работает.
В чём причина пока не знаю
...
Рейтинг: 0 / 0
Использование функции в select
    #32126465
lilo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня девятка
Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production
...
Рейтинг: 0 / 0
Использование функции в select
    #32127770
roboforce
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
то lilo а так получится?
касательно
ругательств на t_pages(n):=v_pages;
-----------------------------------------------------------
CREATE OR REPLACE TYPE "OXA_OBJ" as object(
ls varchar2(12),
.....
mdim number(2)
)
CREATE OR REPLACE TYPE "OXA_TAB" as table of oxa_obj
---------------------------------------------------------
Попробуй так

create or replace function COI_get_oxa2(housid in integer) return oxa_tab is
lsd_obj oxa_obj;
lsdvalue oxa_tab := oxa_tab();
n integer;
begin
lsd_obj := oxa_obj(null,null,null,null,null); инициализируем
for lsd_cur in
(select p.payerid,p.payercode, ....
from payer p,payerinfo pi,flat f, house h,street s, agreetempl ag
where
......)
loop
n:=n+1;
lsdvalue.extend;
lsd_obj.ls :=lsd_cur.payercode;
.....
lsd_obj.mdim :=null;
lsdvalue(lsdvalue.count) := lsd_Obj; присваиваем
.....
...
Рейтинг: 0 / 0
Использование функции в select
    #32131946
IL_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почитал пост softbuilder@inbox.ru и это меня сподвигло на написание своего варианта:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
CREATE OR REPLACE TYPE Date_Table_Object AS OBJECT
(
  DT1 DATE,
  DT2 DATE
 );

CREATE OR REPLACE TYPE Date_Table AS TABLE OF Date_Table_Object;

create or replace function Create_Date_Table(A_DT1 in DATE, A_DT2 in DATE, Step in Numeric) 
return DATE_TABLE is
 -- Var --
 
  Result DATE_TABLE:=DATE_TABLE();
  DT1 DATE;
  DT2 DATE;
  i numeric;
begin
  i:= 1 ;
  DT1:=A_DT1;
  DT2:=A_DT1;
  WHILE (DT1 < A_DT2)AND(i< 1000000 ) LOOP
    Result.Extend;
    DT2:=DT2+(Step/ 86400 );
    Result(i):=Date_Table_Object(DT1,DT2);
    DT1:=DT2;
    i:=i+ 1 ;
  END LOOP;
  return(Result);
end Create_Date_Table;


Цель функции Create_Date_Table, сформировать таблицу дат с DT1 по DT2 с шагом Step (в секундах).

Пример использования:
Код: plaintext
1.
2.
3.
4.
select H.DT1 from TABLE(
  CAST(Create_Date_Table(
    to_date('01.02.2003','DD.MM.YYYY'),
    to_date('02.02.2003','DD.MM.YYYY'),
     3600 ) AS Date_Table)) H


В этом случае все работает просто великолепно! Но стоит изменить запрос хотя бы на следующий:
Код: plaintext
1.
2.
3.
4.
select (select H.DT1 from dual) from TABLE(
  CAST(Create_Date_Table(
    to_date('01.02.2003','DD.MM.YYYY'),
    to_date('02.02.2003','DD.MM.YYYY'),
     3600 ) AS Date_Table)) H

... и все перестает работать... т.е. все записи равны первому значению.

Может кто знает что ни так?

P.S. Выборка "select H.DT1 from dual" конечно придена просто для примера, на самом деле здесь должена стоять выборка, например, суммы за период от H.DT1 до H.DT2.
...
Рейтинг: 0 / 0
Использование функции в select
    #32131963
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
План запроса надо смотреть
...
Рейтинг: 0 / 0
Использование функции в select
    #32132042
IL_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softbuilder@inbox.ru

Если не сложно, подскажи как или по крайней мере где искать?
...
Рейтинг: 0 / 0
Использование функции в select
    #32138067
IL_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа - товарищи подскажите может кто встречался с такой проблеиой (см. на 2 поста выше)? Или это bug в Oracle?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование функции в select
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]