powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / type table
19 сообщений из 44, страница 2 из 2
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
19 сообщений из 44, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / type table
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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