Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Заполнить подколлекцию в коллекции / 8 сообщений из 8, страница 1 из 1
09.07.2018, 15:33
    #39671667
Agat22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить подколлекцию в коллекции
Добрый день,

необходимо в коллекцию OFFICEINFO_LAYOUT_ITEM добавить подколлекцию WORKINGTIME_INFO

[Error] PLS-00231 (814: 48): PLS-00231: функция 'PKG_PROCESS.GETOFFICEWORKINGTIME' не может быть использована в SQL
Думаю, я как-то неправильно использую SELECT * BULK COLLECT INTO arr FROM TABLE
Помогите плиз,


Код: 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.
FUNCTION GetOfficeWorkingTime(p_officeid number) return WORKINGTIME_INFO pipelined is
--показать рабочее время офиса
  l_sql varchar2(1000);
  l_day varchar2(5);
  l_work_from varchar2(5); 
  l_work_till varchar2(5);
begin
  for l_day in 1..7 loop
    l_sql:= 'select '
            ||'wd' || to_char(l_day) ||'_work_from, '
            ||'wd' || to_char(l_day) ||'_work_till '
            ||'from MBL_OFFICES'
            ||'where id = '|| to_char(p_officeid);
                
    dbg(l_sql);
    begin
         execute immediate l_sql into l_work_from, l_work_till;
         dbg('l_day = '||l_day);
         dbg('l_work_from = '||l_work_from);
         dbg('l_work_till = '||l_work_till);
         pipe row(WORKINGTIME_LAYOUT_ITEM(l_day, l_work_from, l_work_till));
    exception
      when others then
       pipe row(WORKINGTIME_LAYOUT_ITEM(l_day, null, null));
    end;
  end loop;  
end;

FUNCTION GetOfficesInfo return OFFICEINFO_LAYOUT pipelined is
--Информация об офисах
cursor c_office is
    SELECT /*+DRIVING_SITE(ZZZ)*/  
       ID, PHONE, LATITUDE, 
      CITY, COUNTRY
    from mbl_offices zzz
    where enabled=1;   
type c_office_type is table of c_office%rowtype;
v_res c_office_type;    
i number;

arr WORKINGTIME_INFO;
begin
 open c_office;
 fetch c_office bulk collect into v_res limit 500;
 if v_res.count > 0  then
 for i in v_res.first..v_res.last loop
     SELECT * BULK COLLECT INTO arr FROM TABLE(GetOfficeWorkingTime(v_res(i).id));

     pipe row(OFFICEINFO_LAYOUT_ITEM(
                                    v_res(i).id ,
                                    v_res(i).phone,
                                    v_res(i).latitude ,
                                    v_res(i).city
                                   ,arr                                  
                                  ));
 end loop;
 end if;
 close c_office;
 SaveActivityLog(5,null,null,null,'OK');
 return;
end;
...
Рейтинг: 0 / 0
09.07.2018, 16:43
    #39671705
Sah
Sah
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить подколлекцию в коллекции
Agat22,

Функция GetOfficeWorkingTime в спецификации пакета объявлена?
В SQL запросах, даже внутри пакета, можно использовать только объявленные в спецификации функции.
...
Рейтинг: 0 / 0
09.07.2018, 17:31
    #39671743
Agat22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить подколлекцию в коллекции
объявил, теперь ругается на

Код: plsql
1.
     SELECT * BULK COLLECT INTO arr FROM TABLE(GetOfficeWorkingTime(v_res(i).id));



[Error] ORA-00947 (814: 37): PL/SQL: ORA-00947: не хватает значений для данных
...
Рейтинг: 0 / 0
10.07.2018, 11:06
    #39671950
alwan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить подколлекцию в коллекции
Agat22,

А точно на эту строку, а не на следующую?
...
Рейтинг: 0 / 0
10.07.2018, 11:15
    #39671962
Agat22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить подколлекцию в коллекции
точно, когда ее убираю - все компилится
...
Рейтинг: 0 / 0
10.07.2018, 11:31
    #39671973
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить подколлекцию в коллекции
Agat22...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
FUNCTION GetOfficeWorkingTime(p_officeid number) return WORKINGTIME_INFO pipelined is
--показать рабочее время офиса
  l_sql varchar2(1000);
  l_day varchar2(5);
  l_work_from varchar2(5); 
  l_work_till varchar2(5);
begin
  for l_day in 1..7 loop
    l_sql:= 'select '
            ||'wd' || to_char(l_day) ||'_work_from, '
            ||'wd' || to_char(l_day) ||'_work_till '
            ||'from MBL_OFFICES'
            ||'where id = '|| to_char(p_officeid);
.......



А не добавить ли Вам пробельчик между таблицей и where ?
...
Рейтинг: 0 / 0
10.07.2018, 13:43
    #39672060
Agat22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить подколлекцию в коллекции
уже нашел и добавил, но проблему это не решило конечно
...
Рейтинг: 0 / 0
11.07.2018, 19:13
    #39672724
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить подколлекцию в коллекции
Что Вы здесь пытаетесь сделать?

Код: plsql
1.
pipe row(WORKINGTIME_LAYOUT_ITEM(l_day, null, null));



Код: plsql
1.
2.
3.
4.
5.
6.
7.
pipe row(OFFICEINFO_LAYOUT_ITEM(
                                    v_res(i).id ,
                                    v_res(i).phone,
                                    v_res(i).latitude ,
                                    v_res(i).city
                                   ,arr                                  
                                  ))



Оператор pipe row возвращает строку под номер i.
То есть правильно было бы так:
Код: plsql
1.
pipe row(WORKINGTIME_LAYOUT_ITEM(l_day));



где l_day - переменная целочисленного типа

а Вы что делаете?

Что за сумасшедшая вложенность?

Заполнить внутреную коллекцию можно:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
TYPE in_array IS RECORD(a NUMBER(10),
                        b NUMBER(10));

TYPE out_array IS RECORD(c NUMBER(10),
                         d in_array);
      
var out_array := out_array();
var.EXTEND;
                   
FOR i IN var.FIRST..var.LAST
LOOP
  var(i).d.EXTEND(10);
  
  FOR j IN var(i).d.FIRST..var(i).d.LAST
  LOOP
    var(i).d(j).a = 1;
    var(i).d(j).b = 2;
  END LOOP;
END LOOP;



1. Перепишите заполнение коллекции через циклы, а не через BULK COLLECT.
2. Упростите структуру объектов.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Заполнить подколлекцию в коллекции / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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