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

Откуда:
Сообщений: 2142
В процедуре создаю таблицу на основе запроса через
EXECUTE IMMEDIATE ' ... '
потом сразу же обращаюсь к ней в цикле
for 
но ругается что такая таблица не существует, но если обащение к ней убираю то само то создание происходит.
Как можно осуществить доступ к только что созданной таблице?
13 авг 09, 22:50    [7536268]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
Bfink
Member

Откуда: Москва
Сообщений: 2797
kasik,

Ругается на этапе трансляции блока PL/SQL, а создаваться таблица должна позже при выполнении.
13 авг 09, 22:57    [7536287]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
semenar
Member

Откуда: Днепропетровск
Сообщений: 3308
Блог
так приведи полность execute immediate и пример обращения. Можно еще посмотреть USER_TABLES и схему по умолчанию..
автор
Как можно осуществить доступ к только что созданной таблице?

Кстати, а чем вызван такой дизайн? Частый DDL не есть признак хорошей организации работы с данными. Поди еще и дропаешь таблички дет?
13 авг 09, 22:59    [7536292]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
kasik
Member

Откуда:
Сообщений: 2142
это вопрос или утверждение? хоть знаки препинания ставьте. в одном pl/sql блоке сразу после создания должно быть отбращение к этой таблице.
13 авг 09, 23:01    [7536301]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
Bfink
Member

Откуда: Москва
Сообщений: 2797
kasik,

Утверждение -
сначала Oracle транслирует Ваш блок и видит, что в FOR таблицы нет - ругается и все.
Если уберете FOR, трансляция проходит и наступает выполнение, где и создается таблица.
13 авг 09, 23:04    [7536310]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
semenar
Member

Откуда: Днепропетровск
Сообщений: 3308
Блог
kasik,

ты пиши, к кому обращаешься. Ускорит получение ответа.
13 авг 09, 23:04    [7536311]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
kasik
Member

Откуда:
Сообщений: 2142
это вопрос или утверждение? хоть знаки препинания ставьте. в одном pl/sql блоке сразу после создания должно быть отбращение к этой таблице.
13 авг 09, 23:07    [7536323]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
Bfink
Member

Откуда: Москва
Сообщений: 2797
semenar,

Я с вашим утверждением по поводу DDL в общем случае не согласен. Все сильно зависит от сложности данных, если программы создают новые типы и объекты на их основе - без DDL не обойтись. Когда объекты измеряются десятками тысяч - поток DDL операций достаточно большой.
13 авг 09, 23:11    [7536342]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
Bfink
Member

Откуда: Москва
Сообщений: 2797
kasik
это вопрос или утверждение? хоть знаки препинания ставьте. в одном pl/sql блоке сразу после создания должно быть отбращение к этой таблице.


Зациклилось....
13 авг 09, 23:12    [7536346]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
kasik
Member

Откуда:
Сообщений: 2142
Bfink,
Я так и подумал про трансляцию, но все же как же быть? можно что либо сделать или придумать по данному поводу?
13 авг 09, 23:13    [7536352]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
Bfink
Member

Откуда: Москва
Сообщений: 2797
kasik,

Вариантов много -
например, все остальное запаковать в блок и выполнить его тоже execute immediate
или таблицу создать сначала, в блоке только заполнять данными.
13 авг 09, 23:16    [7536364]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
kasik
В процедуре создаю таблицу на основе запроса через
EXECUTE IMMEDIATE ' ... '
потом сразу же обращаюсь к ней в цикле
for 
но ругается что такая таблица не существует, но если обащение к ней убираю то само то создание происходит.
Как можно осуществить доступ к только что созданной таблице?


Within same PL/SQL block - only via dynamic SQL:

SQL> BEGIN
  2      EXECUTE IMMEDIATE 'CREATE TABLE TBL AS SELECT ENAME FROM EMP WHERE DEPTNO = 10';
  3      FOR REC IN (SELECT * FROM TBL) LOOP
  4        DBMS_OUTPUT.PUT_LINE(REC.EMPNO);
  5      END LOOP;
  6  END;
  7  /
    FOR REC IN (SELECT * FROM TBL) LOOP
                             *
ERROR at line 3:
ORA-06550: line 3, column 30:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 3, column 16:
PL/SQL: SQL Statement ignored
ORA-06550: line 4, column 28:
PLS-00364: loop index variable 'REC' use is invalid
ORA-06550: line 4, column 7:
PL/SQL: Statement ignored


SQL> DECLARE
  2      V_CUR SYS_REFCURSOR;
  3      v_ENAME VARCHAR2(20);
  4  BEGIN
  5      EXECUTE IMMEDIATE 'CREATE TABLE TBL AS SELECT ENAME FROM EMP WHERE DEPTNO = 10';
  6      OPEN V_CUR FOR 'SELECT * FROM TBL';
  7      LOOP
  8        FETCH V_CUR INTO V_ENAME;
  9        EXIT WHEN V_CUR%NOTFOUND;
 10        DBMS_OUTPUT.PUT_LINE(V_ENAME);
 11      END LOOP;
 12      CLOSE V_CUR;
 13  END;
 14  /
CLARK
KING
MILLER

PL/SQL procedure successfully completed.

SQL> DESC TBL
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ENAME                                              VARCHAR2(10)

SQL> SELECT * FROM TBL
  2  /

ENAME
----------
CLARK
KING
MILLER

SQL>  

SY.

Сообщение было отредактировано: 13 авг 09, 23:20
13 авг 09, 23:18    [7536368]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
-2-
Member

Откуда:
Сообщений: 15330
Bfink
Я с вашим утверждением по поводу DDL в общем случае не согласен.

В обшем может быть, но в данном,... CREATE динамический, а FOR статический. Это говорит о кривом дизайне.
14 авг 09, 00:59    [7536614]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
kasik
Member

Откуда:
Сообщений: 2142
-2-,

Не буду спорить может быть дизайн и кривоват но начнем тогда с самого начала:
мне надо что бы в конструкции for в запросе было использовано условие where из строковой переменной поэтому от сюда и динамика, так что SY попал в самую точку спасибо за ответ ему.
Но если у кого еще есть идею то предлагайте.
14 авг 09, 08:13    [7536952]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54391
kasik
Но если у кого еще есть идею то предлагайте.
Идея-то у большинства одна - не создавать объекты динамически
14 авг 09, 09:15    [7537103]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54391
kasik
мне надо, чтобы в конструкции for в запросе было использовано условие where из строковой переменной, поэтому отсюда и динамика
создайте таблицу заранее, а заполняйте уже динамически
14 авг 09, 09:17    [7537110]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
-2-
Member

Откуда:
Сообщений: 15330
kasik
SY попал в самую точку спасибо за ответ ему

А теперь подумайте, нужно ли вам создавать таблицу, даже - вставлять в таблицу. Может достаточно делать динамический селект.
14 авг 09, 09:34    [7537188]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
amglad
Member

Откуда:
Сообщений: 47
Ничто не мешает вам объявить курсор, динамически задать ему SQL, и в цикле фетчить данные.
Т.е. сделать так, как вы хотите - можно, и просто.

Но это называется "через задницу".
в коде из DDL в ислючительных случаях можно заюзать truncate временных таблиц, например (для производительности иногда помогает), а создавать таблицы и запрашивать из них данные - это нонсенс.
14 авг 09, 10:20    [7537432]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
kasik,

Чую, MS SQLьным духом пахнет
14 авг 09, 10:23    [7537460]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
kasik
Member

Откуда:
Сообщений: 2142
SQLap,

Никогда его не нюхал...

я уже описал что мне надо, и как сделать это без динамики не представляю. поэтому остановился на подходящем варианте от SY.

amglad,
Может быть и нонсенс, но как тогда сделать чтобы было все по вашему грамотно?
14 авг 09, 10:29    [7537508]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
kasik
Member

Откуда:
Сообщений: 2142
Мне кажеться
execute immediate
и сделан для того чтобы сограть нужную комманду как говориться "вручную", а потом выполнить ее... разве не так. а не только использовать для статического значения где все известно!
14 авг 09, 10:33    [7537538]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
kasik
я уже описал что мне надо, и как сделать это без динамики не представляю. поэтому остановился на подходящем варианте от SY.

amglad,
Может быть и нонсенс, но как тогда сделать чтобы было все по вашему грамотно?
Ну уж однозначно не создавать таблицу :) Если Вам действительно нужно писать запрос динамически, то и пишите его динамически, не приплетая создание таблиц. А возможно можно и вовсе обойтись без динамики, но об этом нельзя судить, не видя желаемого.
14 авг 09, 10:33    [7537540]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
amglad
Member

Откуда:
Сообщений: 47
kasik
SQLap,

Никогда его не нюхал...

я уже описал что мне надо, и как сделать это без динамики не представляю. поэтому остановился на подходящем варианте от SY.

amglad,
Может быть и нонсенс, но как тогда сделать чтобы было все по вашему грамотно?


строковая переменная в условии where - это понятно и нормально.
Да, делайте как SY показал - именно это я и имел ввиду.
Я только не понимаю, зачем создавать динамически таблицу? Создайте ее один раз в жизни, а перед
использованием очищайте.
14 авг 09, 10:40    [7537599]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
kasik
Member

Откуда:
Сообщений: 2142
запросы разные в этой таблице храняться она типа временной для получения нужной выборки, остается только название таблицы, а стальное каждый раз все разное.
Jannny,
по поводу все в динамике без создание таблицы вариант нравиться, но если я весь for сделаю динамическим как мне вытащить строковую перемнную которая будет заполнена данными из выборки?
14 авг 09, 11:23    [7537931]     Ответить | Цитировать Сообщить модератору
 Re: [PL/SQL] - обращение к только что созданной таблице.  [new]
Bfink
Member

Откуда: Москва
Сообщений: 2797
kasik,

я скажу в чем Ваша проблема - если два пользователя запустят Ваш блок, то одна сессия упадет из-за дублирования имени таблицы
14 авг 09, 11:32    [7538024]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить