Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / проблемка с написанием функции / 19 сообщений из 19, страница 1 из 1
31.03.2017, 10:49
    #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
31.03.2017, 10:58
    #39430721
AnSi_Sr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемка с написанием функции
bulk collect
...
Рейтинг: 0 / 0
31.03.2017, 11:01
    #39430724
maxwait
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемка с написанием функции
AnSi_Sr,

Да уже читаю о ней... значит правильно думаю... спасибо!
...
Рейтинг: 0 / 0
31.03.2017, 11:02
    #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
03.04.2017, 08:57
    #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
03.04.2017, 09:06
    #39431805
maxwait
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемка с написанием функции
Блин, прочитал что Returning может возвратить данные только из DELETE, EXECUTE IMMEDIATE, INSERT, and UPDATE, т.е. в моем случае Returning не сработает ???
...
Рейтинг: 0 / 0
03.04.2017, 09:13
    #39431808
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемка с написанием функции
Сперва изучи основы, прежде чем в дебри непролазные лезть.
...
Рейтинг: 0 / 0
03.04.2017, 09:22
    #39431823
Be or not to be...
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемка с написанием функции
А return ing стал вдруг строго необходимым элементом функции ?
...
Рейтинг: 0 / 0
03.04.2017, 09:26
    #39431830
maxwait
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемка с написанием функции
Elic, я понимаю, что сперва основы, но вот столкнулся с проблемкой а решать как-то нужно, подскажите пжл. Хоть какой нить примерчик...
...
Рейтинг: 0 / 0
03.04.2017, 09:26
    #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
03.04.2017, 09:33
    #39431841
maxwait
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемка с написанием функции
arlx,

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

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

get_oborotclientgo будет смотреть обороты по Головному отделению, а будут еще функции которые должны смотреть на обороты в филиалах, и решил запилить для каждого филиала свою функцию. т.к. в каждом филиале есть свои нюансы. ну и затем эти функции пригодятся в других местах, вот и решил запилить в функции, чтоб не копипастить код.
...
Рейтинг: 0 / 0
03.04.2017, 14:32
    #39432051
maxwait
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемка с написанием функции
Блин наступил на грабли, не получается вызвать процедуру через @dblink
вылетает ошибка
ORA-30626: function/procedure parameters of remote object types are not
supported
почитал как народ решает эту проблему, получается нужно мой запрос обернуть во вьюху ?
...
Рейтинг: 0 / 0
03.04.2017, 14:38
    #39432059
maxwait
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемка с написанием функции
Извиняюсь, опечатался , функцию вызвать, а не процедуру
...
Рейтинг: 0 / 0
03.04.2017, 14:50
    #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
03.04.2017, 15:05
    #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
04.04.2017, 06:20
    #39432465
Be or not to be...
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблемка с написанием функции
maxwaitно как теперь при вызове вьюхи, которая запускает функцию, передать параметры в функцию... ?

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


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