powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Заполнить подколлекцию в коллекции
8 сообщений из 8, страница 1 из 1
Заполнить подколлекцию в коллекции
    #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
Заполнить подколлекцию в коллекции
    #39671705
Sah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Agat22,

Функция GetOfficeWorkingTime в спецификации пакета объявлена?
В SQL запросах, даже внутри пакета, можно использовать только объявленные в спецификации функции.
...
Рейтинг: 0 / 0
Заполнить подколлекцию в коллекции
    #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
Заполнить подколлекцию в коллекции
    #39671950
alwan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Agat22,

А точно на эту строку, а не на следующую?
...
Рейтинг: 0 / 0
Заполнить подколлекцию в коллекции
    #39671962
Agat22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
точно, когда ее убираю - все компилится
...
Рейтинг: 0 / 0
Заполнить подколлекцию в коллекции
    #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
Заполнить подколлекцию в коллекции
    #39672060
Agat22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
уже нашел и добавил, но проблему это не решило конечно
...
Рейтинг: 0 / 0
Заполнить подколлекцию в коллекции
    #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
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Заполнить подколлекцию в коллекции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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