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

Откуда:
Сообщений: 61
Уважаемые коллеги, добрый день. Помогите понять как использовать временную таблицу по типу Privat в PL/SQL с курсорами.
Есть курсор. Стоит задача после открытия блока begin - наполнить её данными и потом вызвать курсор где она соединяется с другими таблицами. В MANAGEMENT STUDIO всё просто. В ORACLE говорит что таблица не создана. Дело не доходит даже до открытия курсора. Также пробовал через execute immediate. Не получается.
26 ноя 21, 07:21    [22401053]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
=nomad=
Member

Откуда:
Сообщений: 260
Не проще использовать nested-коллекцию?
26 ноя 21, 11:16    [22401136]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
juratorneo
Member

Откуда:
Сообщений: 61
=nomad=,

Может и проще, но у меня на данный момент нет понимания как это сделать даже примерно.
26 ноя 21, 11:32    [22401146]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
1) какая структура "временной таблицы"
2) версия oracle?

.....
stax
26 ноя 21, 11:42    [22401152]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
juratorneo
Member

Откуда:
Сообщений: 61
Stax,
Эм вот

GTT (id_ask number, p_6 varchar2(15), p_9 date, p_11 varchar2(20))


Oracle 19

Структуру курсора нужна ??

В курсоре много join с другими таблицами, а это времянка для расчетов

Сообщение было отредактировано: 26 ноя 21, 11:50
26 ноя 21, 11:47    [22401159]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
AmKad
Member

Откуда:
Сообщений: 5344
juratorneo

Структуру курсора нужна ??
Если нужна будет, что Stax тебя отдельно об этом спросит. Глядишь, когда тема выйдет на вторую и третью страницу, он изъявит желание взглянуть на примеры твоего кода. Но это все потом, потом. А пока хрустальные шарики с наводящими вопросами по одному сообщению на каждый в процессе пыток незадачливого партизана, создавшего эту тему.
26 ноя 21, 12:13    [22401183]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
juratorneo

Структуру курсора нужна ??

нет

в оракле (в старых версиях, в новейших мож и добавили) несколько другой подход к темп таблицам

их надо заранее создавать create ..., на что нужны права

если создавать в процедуре, то вся дальнейшая работа через динамический скл
что часто не очень удобно

Вам можно/надо создать global (private) temporary table и дальше работать с ней как с обычной таблицей

или создать sql обьект create type тмп as table of ... и дальше работать как "nested-коллекцию"

зы
есть еще вариант создавать в пакете type тмп is table of ... оракля сам создаст sql тип,
но лично мне не нравится такой подход

pss
создать ф-цию, возвращающую нужный тмп набор

.....
stax
26 ноя 21, 12:30    [22401200]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
Stax
juratorneo

Структуру курсора нужна ??

нет

в оракле (в старых версиях, в новейших мож и добавили) несколько другой подход к темп таблицам

их надо заранее создавать create ..., на что нужны права

если создавать в процедуре, то вся дальнейшая работа через динамический скл
что часто (мне) не очень удобно

Вам можно/надо создать global (private) temporary table и дальше работать с ней как с обычной таблицей

или создать sql обьект create type тмп as table of ... и дальше работать как "nested-коллекцию"

зы
есть еще вариант создавать в пакете type тмп is table of ... оракля сам создаст sql тип,
но лично мне не нравится такой подход

pss
создать ф-цию, возвращающую нужный тмп набор

.....
stax
26 ноя 21, 12:32    [22401203]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
juratorneo
Member

Откуда:
Сообщений: 61
Stax
juratorneo

Структуру курсора нужна ??

нет

в оракле (в старых версиях, в новейших мож и добавили) несколько другой подход к темп таблицам

их надо заранее создавать create ..., на что нужны права

если создавать в процедуре, то вся дальнейшая работа через динамический скл
что часто не очень удобно

Вам можно/надо создать global (private) temporary table и дальше работать с ней как с обычной таблицей

.....
stax


Именно так я и сделал и все прекрасно работает. Но мне этот вариант не устраивает впринципе. Не хочу плодить лишние таблицы даже если они пустые. И забивать ими tempDB. Другое дело таблица в оперативной памяти на время сессии или транзакции после чего уничтожается.
А что там на счет коллекций??
26 ноя 21, 12:54    [22401221]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
juratorneo

Другое дело таблица в оперативной памяти на время сессии или транзакции после чего уничтожается.
А что там на счет коллекций??


так имхо Private Temporary Tables (PTT) какраз в ОП, и уничтожается

с коллекцией нужен пример?

ps
еще один изврат, формировать хмл
и from xml_table()

.....
stax
26 ноя 21, 13:22    [22401243]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
juratorneo
Member

Откуда:
Сообщений: 61
Stax
juratorneo

Другое дело таблица в оперативной памяти на время сессии или транзакции после чего уничтожается.
А что там на счет коллекций??


так имхо Private Temporary Tables (PTT) какраз в ОП, и уничтожается

с коллекцией нужен пример?

ps
еще один изврат, формировать хмл
и from xml_table()

.....
stax


Так я ж и говорю что хотел провернуть с таблицами по типу PRIVATE, но с курсором это не работает. Пришлось перейти на GLOBAL. Но с GLOBAL вариант не импонирует по нескольким причинам. )
Пример с коллекцией очень нужен особенно как его подружить с курсорами. В курсор данные подгружаются из одного источника, а для времянки из другого источника где происходит расчет и потом должно как то попадать к данным в курсор
26 ноя 21, 13:29    [22401250]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
juratorneo,
create or replace TYPE stax_ask as object(
  id_ask number, p_6 varchar2(15), p_9 date, p_11 varchar2(20)
  );

create or replace type stax_task as table of  stax_ask; 

declare
 v_tt stax_task :=stax_task();
 begin
  v_tt.extend(2);
  v_tt(1):=stax_ask(10,null,null,null);
  v_tt(2):=stax_ask(20,null,null,null);
  for r in (select a.id_ask,d.dname from dept d,table(v_tt) a where d.deptno=a.id_ask) loop
   dbms_output.put_line(r.id_ask||' '||r.dname);
  end loop;
end;

10 ACCOUNTING
20 RESEARCH

Statement processed.


.....
stax
26 ноя 21, 13:45    [22401261]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19924
juratorneo

Пример с коллекцией очень нужен особенно как его подружить с курсорами. В курсор данные подгружаются из одного источника, а для времянки из другого источника где происходит расчет и потом должно как то попадать к данным в курсор

https://oracle-base.com/articles/12c/using-the-table-operator-with-locally-defined-types-in-plsql-12cr1
26 ноя 21, 13:49    [22401264]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
PuM256
Member

Откуда:
Сообщений: 168
juratorneo
Не хочу плодить лишние таблицы даже если они пустые. И забивать ими tempDB. Другое дело таблица в оперативной памяти на время сессии или транзакции после чего уничтожается.

На всякий случай уточню, что данные в GTT как раз и хранятся на время сессии (или даже до коммита, смотря как создадите).
26 ноя 21, 14:10    [22401280]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19924
PuM256
juratorneo
Не хочу плодить лишние таблицы даже если они пустые. И забивать ими tempDB. Другое дело таблица в оперативной памяти на время сессии или транзакции после чего уничтожается.

На всякий случай уточню, что данные в GTT как раз и хранятся на время сессии (или даже до коммита, смотря как создадите).

У ТС по ходу немеряно оперативки, но нет места под temp tablespace :)
26 ноя 21, 14:18    [22401289]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
SY
Member

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

Есть курсор. Стоит задача после открытия блока begin - наполнить её данными и потом вызвать курсор где она соединяется с другими таблицами. В MANAGEMENT STUDIO всё просто. В ORACLE говорит что таблица не создана. Дело не доходит даже до открытия курсора. Также пробовал через execute immediate. Не получается.


CREATE PRIVATE TEMPORARY TABLE ORA$PTT_TEST_TBL
  AS
    SELECT  *
      FROM  EMP
/
SET SERVEROUTPUT ON
DECLARE
    CURSOR V_CUR
      IS
    SELECT  D.DNAME,
            E.ENAME
      FROM  ORA$PTT_TEST_TBL E,
            DEPT D
      WHERE D.DEPTNO = E.DEPTNO;
BEGIN
    FOR V_REC IN V_CUR LOOP
      DBMS_OUTPUT.PUT_LINE(RPAD(V_REC.ENAME,11) || V_REC.DNAME);
    END LOOP;
END;
/

SMITH      RESEARCH
ALLEN      SALES
WARD       SALES
JONES      RESEARCH
MARTIN     SALES
BLAKE      SALES
CLARK      ACCOUNTING
SCOTT      RESEARCH
KING       ACCOUNTING
TURNER     SALES
ADAMS      RESEARCH
JAMES      SALES
FORD       RESEARCH
MILLER     ACCOUNTING

PL/SQL procedure successfully completed.

SQL>


SY.

Сообщение было отредактировано: 26 ноя 21, 15:04
26 ноя 21, 15:02    [22401327]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
juratorneo
Member

Откуда:
Сообщений: 61
andrey_anonymous
juratorneo

Пример с коллекцией очень нужен особенно как его подружить с курсорами. В курсор данные подгружаются из одного источника, а для времянки из другого источника где происходит расчет и потом должно как то попадать к данным в курсор

https://oracle-base.com/articles/12c/using-the-table-operator-with-locally-defined-types-in-plsql-12cr1


Сколько не пытался я не понимаю что это такое. Ну не понимаю!!
26 ноя 21, 15:59    [22401365]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19924
juratorneo
Ну не понимаю!!

Ну даже не знаю, что и посоветовать.
Разве что нанять специалиста.
26 ноя 21, 16:02    [22401368]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
juratorneo
Member

Откуда:
Сообщений: 61
PuM256
juratorneo
Не хочу плодить лишние таблицы даже если они пустые. И забивать ими tempDB. Другое дело таблица в оперативной памяти на время сессии или транзакции после чего уничтожается.

На всякий случай уточню, что данные в GTT как раз и хранятся на время сессии (или даже до коммита, смотря как создадите).

Полностью согласен. Разница лишь в том, что PRIVAT создаётся в оперативной памяти с теми же delete или preserve. Но GLOBAL создаётся в temporary tablespace и хранит там свои данные. Далее очищается, только вот после этого HWM уже не мдвинешь потому вто выделенные сегменты её сдвинули и tablespace со временем может расти и потом потребует обслуживания. С PRIVAT всё гораздо лучше.
26 ноя 21, 16:02    [22401370]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
juratorneo
Member

Откуда:
Сообщений: 61
SY
juratorneo

Есть курсор. Стоит задача после открытия блока begin - наполнить её данными и потом вызвать курсор где она соединяется с другими таблицами. В MANAGEMENT STUDIO всё просто. В ORACLE говорит что таблица не создана. Дело не доходит даже до открытия курсора. Также пробовал через execute immediate. Не получается.


CREATE PRIVATE TEMPORARY TABLE ORA$PTT_TEST_TBL
  AS
    SELECT  *
      FROM  EMP
/
SET SERVEROUTPUT ON
DECLARE
    CURSOR V_CUR
      IS
    SELECT  D.DNAME,
            E.ENAME
      FROM  ORA$PTT_TEST_TBL E,
            DEPT D
      WHERE D.DEPTNO = E.DEPTNO;
BEGIN
    FOR V_REC IN V_CUR LOOP
      DBMS_OUTPUT.PUT_LINE(RPAD(V_REC.ENAME,11) || V_REC.DNAME);
    END LOOP;
END;
/

SMITH      RESEARCH
ALLEN      SALES
WARD       SALES
JONES      RESEARCH
MARTIN     SALES
BLAKE      SALES
CLARK      ACCOUNTING
SCOTT      RESEARCH
KING       ACCOUNTING
TURNER     SALES
ADAMS      RESEARCH
JAMES      SALES
FORD       RESEARCH
MILLER     ACCOUNTING

PL/SQL procedure successfully completed.

SQL>


SY.


Как все просто через интерфейс)). Только вот в приложение это не запихнуть. Между begin и end. Потому что на этот момент времянка не создана и курсор скажет что такой таблице не существует. В этом то и гемор.
26 ноя 21, 16:07    [22401374]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
juratorneo
Member

Откуда:
Сообщений: 61
Stax
juratorneo,
create or replace TYPE stax_ask as object(
  id_ask number, p_6 varchar2(15), p_9 date, p_11 varchar2(20)
  );

create or replace type stax_task as table of  stax_ask; 

declare
 v_tt stax_task :=stax_task();
 begin
  v_tt.extend(2);
  v_tt(1):=stax_ask(10,null,null,null);
  v_tt(2):=stax_ask(20,null,null,null);
  for r in (select a.id_ask,d.dname from dept d,table(v_tt) a where d.deptno=a.id_ask) loop
   dbms_output.put_line(r.id_ask||' '||r.dname);
  end loop;
end;

10 ACCOUNTING
20 RESEARCH

Statement processed.


.....
stax


Благодарю за помощь. Попытаюсь осмыслить и интерпретировать на своё негодование)
26 ноя 21, 16:11    [22401379]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19924
juratorneo
Полностью согласен. Разница лишь в том, что PRIVAT создаётся в оперативной памяти с теми же delete или preserve. Но GLOBAL создаётся в temporary tablespace и хранит там свои данные. Далее очищается, только вот после этого HWM уже не мдвинешь потому вто выделенные сегменты её сдвинули и tablespace со временем может расти и потом потребует обслуживания.

Мда...
Может, все-таки стоит немного подтянуть тему HWM в temp-сегменте?

juratorneo
С PRIVAT всё гораздо лучше.

Ну да, ну да.
ORA-4030 - гораздо лучше, чем пользовать инструменты по предназначению.
26 ноя 21, 16:11    [22401380]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
juratorneo

Полностью согласен. Разница лишь в том

как быть с реконнектом?

.....
stax
26 ноя 21, 16:12    [22401382]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
juratorneo

Сколько не пытался я не понимаю что это такое. Ну не понимаю!!


что конкретно не понимаете (какую строку в коде)?

фича ето, что для пакетов sql типы создаются автоматом,
обычно ДБА от них в восторге (SYS_PLSQL_хххххх_ччч_ф)

.....
stax
26 ноя 21, 16:22    [22401388]     Ответить | Цитировать Сообщить модератору
 Re: Privat Temporary table in PL/SQL WITH Cursor  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19924
Stax
фича ето, что для пакетов sql типы создаются автоматом,
обычно ДБА от них в восторге (SYS_PLSQL_хххххх_ччч_ф

Начиная с 18с это не так, даже баг специальный по этому поводу закодили :)
26 ноя 21, 16:27    [22401398]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить