powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / type table
25 сообщений из 44, страница 1 из 2
type table
    #39729328
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, помогите дилетанту. Как делать правильно, чтобы избежать ошибки?
...
Рейтинг: 0 / 0
type table
    #39729342
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

xtbl что из себя представляет?

....
stax
...
Рейтинг: 0 / 0
type table
    #39729343
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовать SQL тип коллекции а не PL/SQL тип коллекции.

SY.
...
Рейтинг: 0 / 0
type table
    #39729351
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Stax, сегодня, 14:57 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21726912] [21726912]
>xtbl что из себя представляет?
<
Код: plsql
1.
2.
3.
4.
5.
6.
7.
  -- создаем глобальный тип данных, локальный нельзя использовать
   create or replace type row_tb as object (
    numopzn VARCHAR2(30),
    codprvr VARCHAR2(1),
    dateizm DATE
   );
   create or replace type tt_tb is table of row_tb;
...
Рейтинг: 0 / 0
type table
    #39729353
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>SY, сегодня, 14:57 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21726914] [21726914]
>Использовать SQL тип коллекции а не PL/SQL тип коллекции.
<Как это сделать?
...
Рейтинг: 0 / 0
type table
    #39729367
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> ed
Wrote file afiedt.buf

  1  declare
  2   cur_viborka sys_refcursor;
  3   xtbl tt_tb;
  4  begin
  5   open cur_viborka for select * from table(xtbl);
  6   close cur_viborka;
  7* end;
SQL> /

PL/SQL procedure successfully completed.

SQL> show err
No errors.
SQL>



....
stax
...
Рейтинг: 0 / 0
type table
    #39729384
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Stax, сегодня, 15:37 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21726994] [21726994]
>SQL> ed...
<Я привел ошибку времени исполнения, а не компиляции
...
Рейтинг: 0 / 0
type table
    #39729389
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевЯ привел ошибку времени исполнения, а не компиляцииРаскрой мысль, а тут одни дилетанты, не понимают к чему это.
...
Рейтинг: 0 / 0
type table
    #39729410
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевЯ привел ошибку времени исполнения, а не компиляции

Анонимный PL/SQL блок компилируется и выполняется в одном флаконе. Иcходя из твоего отвeта Станиславу ты уже используешь SQL типы - обьектный row_tb и nested table tt_tb. Тогда что есть xtbl? Определен xtbl как tt_tb или? Похоже нет. Иначе все пучком:

Код: 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.
SQL>    create or replace type row_tb as object (
  2      numopzn VARCHAR2(30),
  3      codprvr VARCHAR2(1),
  4      dateizm DATE
  5     )
  6  /

Type created.

SQL>    create or replace type tt_tb is table of row_tb
  2  /

Type created.

SQL> variable cur_viborka refcursor
SQL> declare
  2      xtbl tt_tb;
  3  begin
  4      xtbl := tt_tb(row_tb('A','X',date '2018-01-01'),row_tb('B','Y',sysdate));
  5      open :cur_viborka for select * from table(xtbl);
  6  end;
  7  /

PL/SQL procedure successfully completed.

SQL> print cur_viborka

NUMOPZN                        C DATEIZM
------------------------------ - ---------
A                              X 01-JAN-18
B                              Y 07-NOV-18

SQL> 



SY.
...
Рейтинг: 0 / 0
type table
    #39729422
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевЯ привел ошибку времени исполнения, а не компиляции

У вас компилится но не выполняется?

cur_viborka как обьявлен?

зи
21726994 компиляция и выполнение

....
stax
...
Рейтинг: 0 / 0
type table
    #39729425
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>SY, сегодня, 16:32 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21727082] [21727082]
>Анонимный PL/SQL блок компилируется…

<Решаю задачу на min/max. Вот полный код:
Код: 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.
  procedure Srez_RN( cur_viborka out t_cursor, x_pk in varchar2, x_dt_srez_new in date, x_dt_srez_old in date) 
  IS
    CURSOR cr IS
      select obv.numopzn,SUBSTR(obv.codprvr,1,1) codprvr, obv.dateizm
      from OBJVR obv, tbl_tmp_pk pk 
      where 
        obv.numopzn = pk.numopzn and
        (TRUNC(obv.dateizm) <= x_dt_srez_new) and (TRUNC(obv.dateizm) > x_dt_srez_old) and
        obv.codprvr in ('РАЗ...','НЕРАЗ...') and
        SUBSTR(trim(obv.nuved),16)='/12' and obv.DEL is null
      order by obv.numopzn;
    xrow cr%ROWTYPE; xtbl tt_tb;
  BEGIN
    execute immediate 'TRUNCATE TABLE tbl_tmp_pk';  str2tbl(x_pk);
    xrow.numopzn := '#';  xtbl := tt_tb(); -- инициализация

    FOR cr_row IN cr LOOP
      -- Обработка информации по новому ТБ ?
      IF cr_row.numopzn <> xrow.numopzn THEN
        -- Да. Обработка 1-ой строки курсора? 
        IF xrow.numopzn <> '#' THEN
          -- Нет. Перепись найденной строки во временную таблицу
          xtbl.extend; xtbl(xtbl.count):= row_tb(xrow.numopzn, xrow.codprvr, xrow.dateizm);
        END IF;
        xrow := cr_row;
      ELSE
        -- Обработка информации по текущему ТБ. Более позднее состояние ТБ?
        IF xrow.dateizm < cr_row.dateizm THEN xrow := cr_row;  END IF;
      END IF;
    END LOOP;
    -- Перепись крайней найденной строки во временную таблицу
    IF xrow.numopzn <> '#' THEN
      xtbl.extend; xtbl(xtbl.count):= row_tb(xrow.numopzn, xrow.codprvr, xrow.dateizm);
    END IF;
    open cur_viborka for SELECT * FROM table(xtbl);
    DELETE tbl_tmp_pk; COMMIT;
  end Srez_RN;
...
Рейтинг: 0 / 0
type table
    #39729435
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

t_cursor как обьявлен?

.....
stax
...
Рейтинг: 0 / 0
type table
    #39729447
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия Oracle?

SY.
...
Рейтинг: 0 / 0
type table
    #39729455
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Stax, сегодня, 16:53 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21727117][21727117]
>t_cursor как обьявлен?
<
Код: plsql
1.
2.
  -- Public type declarations
  type t_cursor is ref cursor;
...
Рейтинг: 0 / 0
type table
    #39729457
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>SY, сегодня, 17:06 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21727139] [21727139]
>Версия Oracle?
<8.17
...
Рейтинг: 0 / 0
type table
    #39729465
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев>
>Версия Oracle?
<8.17

Похоже приехали :).

SY
...
Рейтинг: 0 / 0
type table
    #39729471
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

Код: 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.
  1  declare
  2  type t_cursor is ref cursor;
  3  cur t_cursor;
  4  v int;
  5  procedure Srez_RN( cur_viborka out t_cursor, x_pk in varchar2, x_dt_srez_new in date, x_dt_srez_old in date)
  6    IS
  7      CURSOR cr IS
  8        select obv.ename numopzn, substr(obv.job,1,1) codprvr, obv.hiredate dateizm
  9        from emp obv
 10        order by 2;
 11      xrow cr%ROWTYPE; xtbl tt_tb;
 12    BEGIN
 13  --    execute immediate 'TRUNCATE TABLE tbl_tmp_pk';  str2tbl(x_pk);
 14      xrow.numopzn := '#';  xtbl := tt_tb(); -- инициализация
 15      FOR cr_row IN cr LOOP
 16        -- Обработка информации по новому ТБ ?
 17        IF cr_row.numopzn <> xrow.numopzn THEN
 18          -- Да. Обработка 1-ой строки курсора?
 19          IF xrow.numopzn <> '#' THEN
 20            -- Нет. Перепись найденной строки во временную таблицу
 21            xtbl.extend; xtbl(xtbl.count):= row_tb(xrow.numopzn, xrow.codprvr, xrow.dateizm);
 22          END IF;
 23          xrow := cr_row;
 24        ELSE
 25          -- Обработка информации по текущему ТБ. Более позднее состояние ТБ?
 26          IF xrow.dateizm < cr_row.dateizm THEN xrow := cr_row;  END IF;
 27        END IF;
 28      END LOOP;
 29      -- Перепись крайней найденной строки во временную таблицу
 30      IF xrow.numopzn <> '#' THEN
 31        xtbl.extend; xtbl(xtbl.count):= row_tb(xrow.numopzn, xrow.codprvr, xrow.dateizm);
 32      END IF;
 33      open cur_viborka for SELECT * FROM table(xtbl);
 34  --    DELETE tbl_tmp_pk; COMMIT;
 35    end Srez_RN;
 36  begin
 37   Srez_RN(cur,'a',sysdate,sysdate);
 38   close cur;
 39* end;
SQL> /

PL/SQL procedure successfully completed.



....
stax
...
Рейтинг: 0 / 0
type table
    #39729523
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

У тебя 8.1.7? В принципе дoлжно работать и на 8.1.7, а в действительности...

SY.
...
Рейтинг: 0 / 0
type table
    #39729551
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYВ принципе дoлжно работать и на 8.1.7Напрямую из plsql-переменной нет.
...
Рейтинг: 0 / 0
type table
    #39729557
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>-2-, сегодня, 19:42 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21727316] [21727316]
>Напрямую из plsql-переменной нет.
<А как не напрямую?
...
Рейтинг: 0 / 0
type table
    #39729563
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-SYВ принципе дoлжно работать и на 8.1.7Напрямую из plsql-переменной нет.

A, традиционное PL/SQL запаздывает на один релиз :).

SY.
...
Рейтинг: 0 / 0
type table
    #39729569
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевА как не напрямую?

Динамический SQL. Попрoбуй:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> variable cur_viborka refcursor
SQL> declare
  2      xtbl tt_tb;
  3  begin
  4      xtbl := tt_tb(row_tb('A','X',date '2018-01-01'),row_tb('B','Y',sysdate));
  5      open :cur_viborka for 'select * from table(:1)' using xtbl;
  6  end;
  7  /

PL/SQL procedure successfully completed.

SQL> print cur_viborka

NUMOPZN                        C DATEIZM
------------------------------ - ---------
A                              X 01-JAN-18
B                              Y 07-NOV-18

SQL> 



Хотя боюсь придется ваять весь SQL:

Код: 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.
SQL> declare
  2      v_stmt varchar2(4000) := 'select * from table(tt_tb(';
  3      v_delimiter varchar2(1);
  4  begin
  5      for v_rec in (select ename numopzn,substr(job,1,1) codprvr,hiredate dateizm
  6                      from emp
  7                      where deptno = 10
  8                   ) loop
  9        v_stmt := v_stmt || v_delimiter || 'row_tb(''' || v_rec.numopzn ||
 10                  ''',''' || v_rec.codprvr || ''',to_date(''' ||
 11                  to_char(v_rec.dateizm,'yyyy/mm/dd hh24:mi:ss') ||
 12                  ''',''yyyy/mm/dd hh24:mi:ss''))';
 13        v_delimiter := ',';
 14      end loop;
 15      open :cur_viborka for v_stmt || '))';
 16  end;
 17  /

PL/SQL procedure successfully completed.

SQL> print cur_viborka

NUMOPZN                        C DATEIZM
------------------------------ - ---------
CLARK                          M 09-JUN-81
KING                           P 17-NOV-81
MILLER                         C 23-JAN-82

SQL> 



SY.
...
Рейтинг: 0 / 0
type table
    #39729576
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>SY, сегодня, 20:36 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21727374] [21727374]
>Динамический SQL. Попрoбуй:
<Спасибо. Но мне больше нравится этот вариант:
Код: plsql
1.
2.
3.
4.
5.
6.
   CREATE GLOBAL TEMPORARY TABLE tbl_tmp_rn(
     numopzn VARCHAR2(30)
     ,codprvr VARCHAR2(15)
     ,dateizm DATE 
   )
  ON COMMIT PRESERVE ROWS;
...
Рейтинг: 0 / 0
type table
    #39729738
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYДинамический SQL.Возможно достаточно будет написать cast переменной к тому же sql-типу или подзапрос с cast.
...
Рейтинг: 0 / 0
type table
    #39729745
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-SYДинамический SQL.Возможно достаточно будет написать cast переменной к тому же sql-типу или подзапрос с cast.Собственно, документация :
Manipulating Local CollectionsWithin PL/SQL, to manipulate a local collection, use the operators TABLE and CAST.
...
Рейтинг: 0 / 0
25 сообщений из 44, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / type table
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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