powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Privat Temporary table in PL/SQL WITH Cursor
25 сообщений из 49, страница 1 из 2
Privat Temporary table in PL/SQL WITH Cursor
    #40115111
juratorneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые коллеги, добрый день. Помогите понять как использовать временную таблицу по типу Privat в PL/SQL с курсорами.
Есть курсор. Стоит задача после открытия блока begin - наполнить её данными и потом вызвать курсор где она соединяется с другими таблицами. В MANAGEMENT STUDIO всё просто. В ORACLE говорит что таблица не создана. Дело не доходит даже до открытия курсора. Также пробовал через execute immediate. Не получается.
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115160
=nomad=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не проще использовать nested-коллекцию?
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115167
juratorneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
=nomad=,

Может и проще, но у меня на данный момент нет понимания как это сделать даже примерно.
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115170
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) какая структура "временной таблицы"
2) версия oracle?

.....
stax
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115174
juratorneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Эм вот

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


Oracle 19

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

В курсоре много join с другими таблицами, а это времянка для расчетов
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115193
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
juratorneo

Структуру курсора нужна ??
Если нужна будет, что Stax тебя отдельно об этом спросит. Глядишь, когда тема выйдет на вторую и третью страницу, он изъявит желание взглянуть на примеры твоего кода. Но это все потом, потом. А пока хрустальные шарики с наводящими вопросами по одному сообщению на каждый в процессе пыток незадачливого партизана, создавшего эту тему.
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115206
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
juratorneo

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

нет

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

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

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

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

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

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

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

.....
stax
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115209
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
juratorneo

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

нет

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

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

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

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

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

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

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

.....
stax
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115219
juratorneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
juratorneo

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

нет

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

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

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

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

.....
stax


Именно так я и сделал и все прекрасно работает. Но мне этот вариант не устраивает впринципе. Не хочу плодить лишние таблицы даже если они пустые. И забивать ими tempDB. Другое дело таблица в оперативной памяти на время сессии или транзакции после чего уничтожается.
А что там на счет коллекций??
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115227
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
juratorneo

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


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

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

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

.....
stax
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115233
juratorneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
juratorneo

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


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

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

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

.....
stax


Так я ж и говорю что хотел провернуть с таблицами по типу PRIVATE, но с курсором это не работает. Пришлось перейти на GLOBAL. Но с GLOBAL вариант не импонирует по нескольким причинам. )
Пример с коллекцией очень нужен особенно как его подружить с курсорами. В курсор данные подгружаются из одного источника, а для времянки из другого источника где происходит расчет и потом должно как то попадать к данным в курсор
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115242
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
juratorneo,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115244
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
juratorneo

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

https://oracle-base.com/articles/12c/using-the-table-operator-with-locally-defined-types-in-plsql-12cr1
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115255
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
juratorneo
Не хочу плодить лишние таблицы даже если они пустые. И забивать ими tempDB. Другое дело таблица в оперативной памяти на время сессии или транзакции после чего уничтожается.

На всякий случай уточню, что данные в GTT как раз и хранятся на время сессии (или даже до коммита, смотря как создадите).
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115263
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PuM256
juratorneo
Не хочу плодить лишние таблицы даже если они пустые. И забивать ими tempDB. Другое дело таблица в оперативной памяти на время сессии или транзакции после чего уничтожается.

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

У ТС по ходу немеряно оперативки, но нет места под temp tablespace :)
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115278
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
juratorneo

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


Код: 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.
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.
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115292
juratorneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous
juratorneo

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

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


Сколько не пытался я не понимаю что это такое. Ну не понимаю!!
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115293
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
juratorneo
Ну не понимаю!!

Ну даже не знаю, что и посоветовать.
Разве что нанять специалиста.
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115295
juratorneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PuM256
juratorneo
Не хочу плодить лишние таблицы даже если они пустые. И забивать ими tempDB. Другое дело таблица в оперативной памяти на время сессии или транзакции после чего уничтожается.

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

Полностью согласен. Разница лишь в том, что PRIVAT создаётся в оперативной памяти с теми же delete или preserve. Но GLOBAL создаётся в temporary tablespace и хранит там свои данные. Далее очищается, только вот после этого HWM уже не мдвинешь потому вто выделенные сегменты её сдвинули и tablespace со временем может расти и потом потребует обслуживания. С PRIVAT всё гораздо лучше.
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115296
juratorneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY
juratorneo

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


Код: 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.
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. Потому что на этот момент времянка не создана и курсор скажет что такой таблице не существует. В этом то и гемор.
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115301
juratorneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
juratorneo,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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


Благодарю за помощь. Попытаюсь осмыслить и интерпретировать на своё негодование)
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115302
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
juratorneo
Полностью согласен. Разница лишь в том, что PRIVAT создаётся в оперативной памяти с теми же delete или preserve. Но GLOBAL создаётся в temporary tablespace и хранит там свои данные. Далее очищается, только вот после этого HWM уже не мдвинешь потому вто выделенные сегменты её сдвинули и tablespace со временем может расти и потом потребует обслуживания.

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

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

Ну да, ну да.
ORA-4030 - гораздо лучше, чем пользовать инструменты по предназначению.
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115303
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
juratorneo

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

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

.....
stax
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115308
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
juratorneo

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


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

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

.....
stax
...
Рейтинг: 0 / 0
Privat Temporary table in PL/SQL WITH Cursor
    #40115315
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
фича ето, что для пакетов sql типы создаются автоматом,
обычно ДБА от них в восторге (SYS_PLSQL_хххххх_ччч_ф

Начиная с 18с это не так, даже баг специальный по этому поводу закодили :)
...
Рейтинг: 0 / 0
25 сообщений из 49, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Privat Temporary table in PL/SQL WITH Cursor
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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