Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 type table  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1708
Коллеги, помогите дилетанту. Как делать правильно, чтобы избежать ошибки?

К сообщению приложен файл. Размер - 61Kb
7 ноя 18, 14:37    [21726860]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1379
ВМоисеев,

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

....
stax
7 ноя 18, 14:57    [21726912]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9173
Использовать SQL тип коллекции а не PL/SQL тип коллекции.

SY.
7 ноя 18, 14:57    [21726914]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1708
>Stax, сегодня, 14:57 [21726912]
>xtbl что из себя представляет?
<
  -- создаем глобальный тип данных, локальный нельзя использовать
   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;
7 ноя 18, 15:15    [21726948]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1708
>SY, сегодня, 14:57 [21726914]
>Использовать SQL тип коллекции а не PL/SQL тип коллекции.
<Как это сделать?
7 ноя 18, 15:17    [21726953]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1379
ВМоисеев,

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
7 ноя 18, 15:37    [21726994]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1708
>Stax, сегодня, 15:37 [21726994]
>SQL> ed...
<Я привел ошибку времени исполнения, а не компиляции
7 ноя 18, 15:54    [21727038]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
-2-
Member

Откуда:
Сообщений: 13988
ВМоисеев
Я привел ошибку времени исполнения, а не компиляции
Раскрой мысль, а тут одни дилетанты, не понимают к чему это.
7 ноя 18, 16:05    [21727053]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9173
ВМоисеев
Я привел ошибку времени исполнения, а не компиляции


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

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.
7 ноя 18, 16:32    [21727082]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1379
ВМоисеев
Я привел ошибку времени исполнения, а не компиляции


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

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

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

....
stax
7 ноя 18, 16:42    [21727100]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1708
>SY, сегодня, 16:32 [21727082]
>Анонимный PL/SQL блок компилируется…

<Решаю задачу на min/max. Вот полный код:
  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;
7 ноя 18, 16:45    [21727103]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1379
ВМоисеев,

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

.....
stax
7 ноя 18, 16:53    [21727117]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9173
Версия Oracle?

SY.
7 ноя 18, 17:06    [21727139]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1708
>Stax, сегодня, 16:53 [21727117]
>t_cursor как обьявлен?
<
  -- Public type declarations
  type t_cursor is ref cursor;
7 ноя 18, 17:10    [21727151]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1708
>SY, сегодня, 17:06 [21727139]
>Версия Oracle?
<8.17
7 ноя 18, 17:11    [21727153]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9173
ВМоисеев
>
>Версия Oracle?
<8.17


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

SY
7 ноя 18, 17:17    [21727163]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1379
ВМоисеев,

  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
7 ноя 18, 17:24    [21727170]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9173
Stax,

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

SY.
7 ноя 18, 18:55    [21727249]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
-2-
Member

Откуда:
Сообщений: 13988
SY
В принципе дoлжно работать и на 8.1.7
Напрямую из plsql-переменной нет.
7 ноя 18, 19:42    [21727316]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1708
>-2-, сегодня, 19:42 [21727316]
>Напрямую из plsql-переменной нет.
<А как не напрямую?
7 ноя 18, 20:00    [21727335]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9173
-2-
SY
В принципе дoлжно работать и на 8.1.7
Напрямую из plsql-переменной нет.


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

SY.
7 ноя 18, 20:20    [21727356]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9173
ВМоисеев
А как не напрямую?


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

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:

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.
7 ноя 18, 20:36    [21727374]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1708
>SY, сегодня, 20:36 [21727374]
>Динамический SQL. Попрoбуй:
<Спасибо. Но мне больше нравится этот вариант:
   CREATE GLOBAL TEMPORARY TABLE tbl_tmp_rn(
     numopzn VARCHAR2(30)
     ,codprvr VARCHAR2(15)
     ,dateizm DATE 
   )
  ON COMMIT PRESERVE ROWS;
7 ноя 18, 20:58    [21727396]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
-2-
Member

Откуда:
Сообщений: 13988
SY
Динамический SQL.
Возможно достаточно будет написать cast переменной к тому же sql-типу или подзапрос с cast.
8 ноя 18, 08:30    [21727670]     Ответить | Цитировать Сообщить модератору
 Re: type table  [new]
-2-
Member

Откуда:
Сообщений: 13988
-2-
SY
Динамический SQL.
Возможно достаточно будет написать cast переменной к тому же sql-типу или подзапрос с cast.
Собственно, документация:
Manipulating Local Collections
Within PL/SQL, to manipulate a local collection, use the operators TABLE and CAST.
8 ноя 18, 08:46    [21727679]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить