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

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

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

SY.
...
Рейтинг: 0 / 0
07.11.2018, 15:15
    #39729351
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type table
>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
07.11.2018, 15:17
    #39729353
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type table
>SY, сегодня, 14:57 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21726914] [21726914]
>Использовать SQL тип коллекции а не PL/SQL тип коллекции.
<Как это сделать?
...
Рейтинг: 0 / 0
07.11.2018, 15:37
    #39729367
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type table
ВМоисеев,

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

Анонимный 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
07.11.2018, 16:42
    #39729422
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type table
ВМоисеевЯ привел ошибку времени исполнения, а не компиляции

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

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

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

....
stax
...
Рейтинг: 0 / 0
07.11.2018, 16:45
    #39729425
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type table
>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
07.11.2018, 16:53
    #39729435
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type table
ВМоисеев,

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

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

SY.
...
Рейтинг: 0 / 0
07.11.2018, 17:10
    #39729455
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type table
>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
07.11.2018, 17:11
    #39729457
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type table
>SY, сегодня, 17:06 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21727139] [21727139]
>Версия Oracle?
<8.17
...
Рейтинг: 0 / 0
07.11.2018, 17:17
    #39729465
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type table
ВМоисеев>
>Версия Oracle?
<8.17

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

SY
...
Рейтинг: 0 / 0
07.11.2018, 17:24
    #39729471
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type 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.
  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
07.11.2018, 18:55
    #39729523
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type table
Stax,

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

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

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

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

Динамический 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
07.11.2018, 20:58
    #39729576
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type table
>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
08.11.2018, 08:30
    #39729738
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type table
SYДинамический SQL.Возможно достаточно будет написать cast переменной к тому же sql-типу или подзапрос с cast.
...
Рейтинг: 0 / 0
08.11.2018, 08:46
    #39729745
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
type table
-2-SYДинамический SQL.Возможно достаточно будет написать cast переменной к тому же sql-типу или подзапрос с cast.Собственно, документация :
Manipulating Local CollectionsWithin PL/SQL, to manipulate a local collection, use the operators TABLE and CAST.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / type table / 25 сообщений из 44, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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