powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / проблемка с написанием функции
19 сообщений из 19, страница 1 из 1
проблемка с написанием функции
    #39430712
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день! подскажите пожалуйста, пишу функцию
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE OR REPLACE FUNCTION FuncName (p_BeginDate IN Date, p_EndDate IN Date)
RETURN type_tab_OborotClient PIPELINED AS
ret type_row_OborotClient;
v_param1 varchar2(10);
v_param2 varchar2(20);
BEGIN
   FOR i IN (
               select col1, col2 from table1
   )
      FOR q in 1 .. 1 
         LOOP
              select col1, col2
              into v_param1 , v_param2 
              from (
                      select col1, col2
                       from TABLE(get_data(p_BeginDate, p_BeginDate, i.col1 ))
                      )
              where.....
              pipe row (type_row_OborotClient(v_param1 , v_param2 ));
          END LOOP;
     END LOOP;
  RETURN;
END;



подскажите пжл. у меня конструкция возвращает коллекцию
select col1, col2
from TABLE(get_data(p_BeginDate, p_BeginDate, i.col1 ))
следовательно вылетает ошибка при вставки в into v_param1 , v_param2
есть ли какая нить конструкция позволяющая вставить коллекцию строк.
типа
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 FOR q in 1 .. 1 
         LOOP
              select col1, col2
              into  table ... (что нить в этом духе)--v_param1 , v_param2 
              from (
                      select col1, col2
                       from TABLE(get_data(p_BeginDate, p_BeginDate, i.col1 ))
                      )
              where.....
          END LOOP;


Киньте пжл ссылку на доки где можно почитать как что-то подобное сделать...
заранее спасибо!
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39430721
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bulk collect
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39430724
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnSi_Sr,

Да уже читаю о ней... значит правильно думаю... спасибо!
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39430725
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwaitследовательноRTFM Database PL/SQL Language Reference (FAQ)
RTFM Database SQL Language Reference (FAQ)
http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39431801
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят подскажите пжл. еще один момент.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TYPE type_row_OborotClient AS OBJECT (
       nameorg varchar2(512)
       , inn varchar2(20)
       , schet varchar2(20)
       , fil varchar(10)
       , oborot_all decimal
       , oborot_40101 decimal
       , Proc decimal
);

Create type type_tab_OborotClient IS TABLE OF type_row_OborotClient;



застрял на моменте как мне из функции вернуть коллекцию

Код: plsql
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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
CREATE OR REPLACE FUNCTION get_OborotForNalog (p_BeginDate IN Date, p_EndDate IN DATE)
RETURN type_tab_OborotClient PIPELINED AS
       ret type_row_OborotClient;

     type type_Inn IS TABLE OF tab1.Inn%TYPE;
     type type_Nameorg IS TABLE OF tab1.Nameorg%TYPE;
     type type_schet IS TABLE OF tab2.acc%TYPE;
     type type_fil IS TABLE OF varchar2(10);
     type type_oborot_all IS TABLE OF tab3.SUM%TYPE;
     type type_oborot_40101 IS TABLE OF tab3.SUM%TYPE;
     type type_proc IS TABLE OF tab3.SUM%TYPE;

     v_Inn   type_Inn;
     v_Nameorg     type_Nameorg;
     v_schet        type_schet;
     v_fil          type_fil;
     v_oborot_all   type_oborot_all;
     v_oborot_40101 type_oborot_40101;
     v_proc         type_proc;


BEGIN
       FOR i IN (
               select col1 /*Инн*/, col2/*счет*/ from table
     )
     LOOP
         FOR q in 1 .. 1
           LOOP
             
             select nameorg
                    , Inn
                    , schet
                    , fil
                    , oborot_all
                    , oborot_40101
                    , Proc
               /*  
                 decode(grouping_id(inn,nameorg),3,1,0) seq_1,
                 decode(grouping_id(inn,nameorg),1,1,0) seq_2,
                 grouping_id(inn,nameorg, schet, fil) grp,
                 'Реестр документов с оборотами менее 0,5% за период с '|| p_BeginDate || ' по ' || p_EndDate as Title
               */  
              BULK COLLECT INTO v_Nameorg, v_Inn, v_schet, v_fil, v_oborot_all, v_oborot_40101, v_proc
              from (
                   select 
                         nameorg
                         , Inn
                         , schet
                         , fil
                         , oborot_all
                         , oborot_40101
                         , Proc
                   from TABLE(GET_OBOROTCLIENTGO('01.01.2017' /*p_BeginDate*/, '01.02.2017' /*p_EndDate*/, '321321313213213' /*Счет col2*/))
                   );
              
              --RETURNING ccusnumnal BULK COLLECT into v_Nameorg ;      

              -- подскажите пжл. как мне возвратить коллекцию ?

              FOR w IN 1 .. 1 /*Это для примера, чтобы проверить. Тут все выводиться*/
                LOOP
                   dbms_output.put_line(v_Nameorg(w)|| ' ' ||v_Inn(w)|| ' ' ||v_schet(w)|| ' '||v_fil(w)|| ' ' || v_oborot_all(w)|| ' ' || v_oborot_40101(w)|| ' ' || v_proc(w));
                END LOOP;

         END LOOP;
     END LOOP;
  RETURN;

EXCEPTION WHEN OTHERS
 THEN raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);

END;



Предполагается вызвать функцию get_OborotForNalog, и получить результат, но застрял на RETURNING ..... BULK COLLECT into v_Nameorg ;
Код: plsql
1.
select * from TABLE(get_OborotForNalog('01.01.2017', '01.02.2017'))


Заранее спасибо!
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39431805
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, прочитал что Returning может возвратить данные только из DELETE, EXECUTE IMMEDIATE, INSERT, and UPDATE, т.е. в моем случае Returning не сработает ???
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39431808
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сперва изучи основы, прежде чем в дебри непролазные лезть.
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39431823
Be or not to be...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А return ing стал вдруг строго необходимым элементом функции ?
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39431830
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic, я понимаю, что сперва основы, но вот столкнулся с проблемкой а решать как-то нужно, подскажите пжл. Хоть какой нить примерчик...
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39431831
arlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может быть попроще, как нибудь так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace function get_oborotfornalog(p_begindate in date, p_enddate in date) return type_tab_oborotclient as
	ret type_tab_oborotclient;
begin
	select type_row_oborotclient(nameorg, inn, schet, fil, oborot_all, oborot_40101, proc) bulk collect
		into ret
		from (select nameorg, inn, schet, fil, oborot_all, oborot_40101, proc
						 from table(get_oborotclientgo('01.01.2017' /*p_BeginDate*/, '01.02.2017' /*p_EndDate*/, '321321313213213'
																						/*Счет col2*/)));
	return ret;
exception
	when others then
		raise_application_error(-20001, 'An error was encountered - ' || sqlcode || ' -ERROR- ' || sqlerrm);
end;
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39431841
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arlx,

Спасибо Большое!! то что нужно!
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39431864
сыноным
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maxwait,

А какой смысл в оборачивании одной функции в другую?
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39431886
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сыноным,

get_oborotclientgo будет смотреть обороты по Головному отделению, а будут еще функции которые должны смотреть на обороты в филиалах, и решил запилить для каждого филиала свою функцию. т.к. в каждом филиале есть свои нюансы. ну и затем эти функции пригодятся в других местах, вот и решил запилить в функции, чтоб не копипастить код.
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39432051
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин наступил на грабли, не получается вызвать процедуру через @dblink
вылетает ошибка
ORA-30626: function/procedure parameters of remote object types are not
supported
почитал как народ решает эту проблему, получается нужно мой запрос обернуть во вьюху ?
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39432059
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, опечатался , функцию вызвать, а не процедуру
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39432071
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделал на Сервере А вьюху
create view umb.view_oborotfornalog2
as
select *
from table(get_oborotfornalog2@otchet_go('01.01.2017', '01.02.2017'));
Вызываю ее через линк на Сервере В
select * from view_oborotfornalog2@СерверА
Отрабатывает, но как теперь при вызове вьюхи, которая запускает функцию, передать параметры в функцию... ?
И почему такие сложности?
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39432087
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwaitсделал на Сервере А вьюху
create view umb.view_oborotfornalog2
as
select *
from table(get_oborotfornalog2@otchet_go('01.01.2017', '01.02.2017'));
Вызываю ее через линк на Сервере В
select * from view_oborotfornalog2@СерверА
Отрабатывает, но как теперь при вызове вьюхи, которая запускает функцию, передать параметры в функцию... ?
И почему такие сложности?
Сложности от неверного выбора архитектуры решения.
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39432465
Be or not to be...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maxwaitно как теперь при вызове вьюхи, которая запускает функцию, передать параметры в функцию... ?

Контекст, пакетные переменные
...
Рейтинг: 0 / 0
проблемка с написанием функции
    #39432543
arlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а если курсором попробовать? что бы процедура возвращала курсор, получится?
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / проблемка с написанием функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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