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

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

SY.

нет восьмерки, да и память сбоит как там было

попробовать
1) явно указать тип 21727670
2) кляузу THE (не помню когда ее забанили)

Код: 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.
SQL> ed
Wrote file afiedt.buf

  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  xtbl tt_tb;
  8    BEGIN
  9      open cur_viborka for SELECT * FROM the(select cast(xtbl as tt_tb) from dual);
 10    end Srez_RN;
 11  begin
 12   Srez_RN(cur,'a',sysdate,sysdate);
 13   close cur;
 14* end;
SQL> /

PL/SQL procedure successfully completed.

SQL> 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  xtbl tt_tb;
  8    BEGIN
  9      open cur_viborka for SELECT * FROM table(cast(xtbl as tt_tb));
 10    end Srez_RN;
 11  begin
 12   Srez_RN(cur,'a',sysdate,sysdate);
 13   close cur;
 14  end;
 15  /

PL/SQL procedure successfully completed.



.....
stax
...
Рейтинг: 0 / 0
type table
    #39729785
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax2) кляузу THE (не помню когда ее забанили)В 8.0 добавили, в 8.1 убрали даже из синтаксических диаграмм.
...
Рейтинг: 0 / 0
type table
    #39730103
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Stax, сегодня, 09:41 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21727727] [21727727]
>...open cur_viborka for SELECT * FROM table(cast(xtbl as tt_tb));...

<
Большое спасибо. Ваш вариант работает штатно и быстро.
Другой вариант работает медленнее:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  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
  begin
    execute immediate 'TRUNCATE TABLE tbl_tmp_pk'; str2tbl(x_pk);
    open cur_viborka for
      select obv.*
      from OBJVR obv, 
       ( select obv.numopzn || MAX(TO_CHAR(obv.dateizm,'YYYYMMDD')) a
         from OBJVR obv, tbl_tmp_pk pk 
         where 
          obv.numopzn = pk.numopzn and
          (TRUNC(obv.dateizm) <= TRUNC(x_dt_srez_new)) and (TRUNC(obv.dateizm) > TRUNC(x_dt_srez_old)) and
          obv.codprvr in ('РАЗ...','НЕРАЗ...') and  SUBSTR(obv.nuved,16)='/03'
         group by obv.numopzn
       ) x 
      where (obv.numopzn || TO_CHAR(obv.dateizm,'YYYYMMDD')) = x.a;
    delete tbl_tmp_pk;
  end Srez_RN;
...
Рейтинг: 0 / 0
type table
    #39730105
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев
Код: plsql
1.
2.
3.
4.
5.
6.
7.
  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
  begin
    execute immediate 'TRUNCATE TABLE tbl_tmp_pk'; str2tbl(x_pk);
...


Дальше можно не читать, код сразу на выброс.
...
Рейтинг: 0 / 0
type table
    #39730114
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>andrey_anonymous, сегодня, 19:06 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21728609][21728609]
>Дальше можно не читать, код сразу на выброс.
<
Почему?
Я не специалист по Oracle, объясните.
...
Рейтинг: 0 / 0
type table
    #39730133
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевЯ не специалист по Oracle, объясните.
1. Для временного хранения данных в oracle существует global temporary table.
2. Использование обычной таблицы вместо GTT предполагает синхронизацию доступа или иной способ развести конкурирующие транзакции. В представленном коде это не учтено - одновременный вызов из двух и более параллельных сессий легко может привести к тихому (без exception) wrong results, причем ошибка будет "плавающая".
3. Даже если Вы решили использовать обычную таблицу вместо temporary - то это не повод выполнять truncate внутри утилитарной процедуры.
truncate относится к DDL, а DDL в oracle фиксируют транзакцию.
Включение такой процедуры в более сложный процесс легко сломает логику вызывающего процесса.

Как общая рекомендация - потратьте день-другой на вдумчивое изучение хотя бы этого раздела , окупится сторицей.
...
Рейтинг: 0 / 0
type table
    #39730147
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>andrey_anonymous, сегодня, 21:25 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21728752] [21728752]
>1. Для временного хранения данных в oracle существует global temporary table.
<
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  -- CREATE GLOBAL TEMPORARY TABLE tbl_tmp_pk( numopzn VARCHAR2(30))
  -- ON COMMIT PRESERVE ROWS
  procedure str2tbl(str in varchar2) is 
    i number; j number; n number;
  begin
    j := 1; n := LENGTH(str); 
    while ( j < n) loop
      i := instr(str,',',j,1);
      INSERT INTO tbl_tmp_pk VALUES (substr(str,j,i-j));
      j := i+1;
    end loop;
  end str2tbl;


так что код можно читать и дальше, и не выбрасывать, а пользоваться
...
Рейтинг: 0 / 0
type table
    #39730158
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевтак что код можно читать и дальше, и не выбрасывать, а пользоваться
Это вряд ли.
truncate тем более надо убрать.
И таблицу лучше объявить on commit delete rows, ни к чему тут preserve.
Что до str2tbl, то
Код: plsql
1.
while ( j < n) loop


суть треш.
Поищите на форуме, тут много примеров парсинга csv-строк.
...
Рейтинг: 0 / 0
type table
    #39730180
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>andrey_anonymous, сегодня, 21:55 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21728791][21728791]
>Это вряд ли.
<На вкус, на цвет...
>...И таблицу лучше объявить on commit delete rows, ни к чему тут preserve.
<Спасибо.
>...суть треш.
<Не понял
...
Рейтинг: 0 / 0
type table
    #39730275
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевНа вкус, на цвет...Распечатай свою нетленку и повесь на стенку в рамочке. Каждый раз смотря на сиё чудо, сможешь вспомнить "Я - Гений".
...
Рейтинг: 0 / 0
type table
    #39730584
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Elic, сегодня, 07:30 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21728971][21728971]
>Распечатай свою нетленку и повесь …
<Увы, но эпистолярный жанр не лечит клинику
...
Рейтинг: 0 / 0
type table
    #39730708
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Stax, вчера, 09:41 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21727727][21727727]
>...open cur_viborka for SELECT * FROM table(cast(xtbl as tt_tb));
<Ещё раз спасибо. Теперь можно так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  -- создаем глобальный тип данных, локальный нельзя использовать
  -- create or replace type row_tb_pk as object ( numopzn VARCHAR2(30));
  -- create or replace type tt_tb_pk is table of row_tb_pk;
  procedure str2tbl(str in varchar2) is 
    i number; j number; n number;
  begin
    j := 1; n := LENGTH(str); 
    while ( j < n) loop
      i := instr(str,',',j,1);
      xtbl_tb_pk.extend; 
      xtbl_tb_pk(xtbl_tb_pk.count):= row_tb_pk(substr(str,j,i-j));
      j := i+1;
    end loop;
  end str2tbl;


и соответственно так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    - - -
    CURSOR cr IS
      select obv.numopzn,SUBSTR(obv.codprvr,1,1) codprvr, obv.dateizm
--      from OBJVR obv, tbl_tmp_pk pk 
      from OBJVR obv, (SELECT * FROM table(cast(xtbl_tb_pk as tt_tb_pk))) pk 
      where 
        obv.numopzn = pk.numopzn and
        (TRUNC(obv.dateizm) <= TRUNC(x_dt_srez_new)) and
        (TRUNC(obv.dateizm) > TRUNC(x_dt_srez_old)) and
        obv.codprvr in ('РАЗ...','НЕРАЗ...') and
        SUBSTR(trim(obv.nuved),16)='/03' and 
        obv.DEL is null
      order by obv.numopzn;
    - - -
...
Рейтинг: 0 / 0
type table
    #39730761
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

from OBJVR obv, table(cast(xtbl_tb_pk as tt_tb_pk)) pk в 8-ке не проходит?

.....
stax
...
Рейтинг: 0 / 0
type table
    #39730810
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Stax, сегодня, 16:40 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21729863][21729863]
>from OBJVR obv, table(cast(xtbl_tb_pk as tt_tb_pk)) pk в 8-ке не проходит?
<Да.
Но мне не понятен такой факт - определяю xtbl_tb_pk так:
Код: plsql
1.
2.
3.
CREATE OR REPLACE PACKAGE BODY NCUYAO_GIS is
   xtbl_tb_pk tt_tb_pk;
- - -


но что делать с содержимым xtbl_tb_pk после выполнения Srez_RN?
Нельзя ли как то преобразовать ==procedure str2tbl(str in varchar2) is== в функцию вида ==function str2tbl(str in varchar2) return tt_tb_pk as== ?
...
Рейтинг: 0 / 0
type table
    #39731593
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

если грубо то
перед выходами из процедуры поcтавить return xtbl_tb_pk; и поменять вызов процедуры на вызов ф-ции

зы
возможно Вам и не надо менять на ф-цию
вместо локальной переменной xtbl пользовать пакетную NCUYAO_GIS.xtbl_tb_pk

.....
stax
...
Рейтинг: 0 / 0
type table
    #39731603
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
CREATE OR REPLACE PACKAGE BODY NCUYAO_GIS is
   xtbl_tb_pk tt_tb_pk;
- - -

Ошибка. Вместо C нужно AH.
...
Рейтинг: 0 / 0
type table
    #39731772
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Stax, сегодня, 11:03 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305005&msg=21731501][21731501]
>...вместо локальной переменной ...
<Крайний вариант такой:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE OR REPLACE PACKAGE BODY NCUYAO_GIS is
  xtbl_tb_pk tt_tb_pk;

  -- создаем глобальный тип данных, локальный нельзя использовать
  -- create or replace type row_tb_pk as object ( numopzn VARCHAR2(30));
  -- create or replace type tt_tb_pk is table of row_tb_pk;
  procedure str2tbl(str in varchar2) is 
    i number; j number; n number;
  begin
    xtbl_tb_pk := tt_tb_pk(); -- инициализация
    j := 1; n := LENGTH(str); 
    while ( j < n) loop
      i := instr(str,',',j,1);
      xtbl_tb_pk.extend; 
      xtbl_tb_pk(xtbl_tb_pk.count):= row_tb_pk(substr(str,j,i-j));
      j := i+1;
    end loop;
  end str2tbl;
_ _ _



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

А он и так чистится:

Код: plsql
1.
    xtbl_tb_pk := tt_tb_pk(); -- инициализация



SY.
...
Рейтинг: 0 / 0
type table
    #39731827
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевКрайний вариант такойНе прошло и недели. Какой шустрый.
Этак ты еще до нового года дойдешь до вопроса, почему оно бесконечно долго висит.
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / type table
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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