Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
rv2plus
Member

Откуда:
Сообщений: 28
Люди добрые, подскажите пожалуйста, почему возникает ошибка identifier 'TEST1' must be declared ? Ведь таблица создана.

DECLARE
	TYPE vtab IS TABLE OF NUMBER;
	varr vtab;
BEGIN
	EXECUTE IMMEDIATE 'CRE
ATE TABLE test1 (id1 INTEGER)';
    SELECT id1 BULK COLLECT INTO varr FROM test1; -- ошибка 
	EXECUTE IMMEDIATE 'DROP TABLE test1';
END;
21 окт 15, 13:41    [18307291]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
На момент компиляции таблица НЕ создана. И неизвестно, будет ли она создана в runtime
21 окт 15, 13:46    [18307320]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
AlexFF__|
Member

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

Что должно быть выполнено - должно быть скомпилено.
21 окт 15, 13:46    [18307325]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
Добрый Э - Эх
Guest
rv2plus,

в момент компиляции (а имена проверяются именно в этот момент) таблицы еще не существует. уж если создал динамически, то далее везде же динамически и используй
21 окт 15, 13:46    [18307326]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Добрый Э - Эх
rv2plus,

в момент компиляции (а имена проверяются именно в этот момент) таблицы еще не существует. уж если создал динамически, то далее везде же динамически и используй


можно поместить запрос к "динамической" таблице в пакет. пока таблицы нет, тело пакета будет развалено, но спецификация пакета останется исправной и с ней можно компилировать другие объекты. после динамического создания таблицы пакетом можно будет пользоваться на этапе выполнения.

но в общем, это некий изврат. может быть Global temporary table тут более уместны.
21 окт 15, 13:56    [18307412]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
rv2plus
Member

Откуда:
Сообщений: 28
Добрый Э - Эх
rv2plus,

в момент компиляции (а имена проверяются именно в этот момент) таблицы еще не существует. уж если создал динамически, то далее везде же динамически и используй


Всем БОЛЬШОЕ СПАСИБО за ответы - всё четко и ясно !
21 окт 15, 14:01    [18307448]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
непонимайка
Guest
mcureenab
после динамического создания таблицы пакетом
еще один пакет и только ради видимости статичности? чтобы выполнять статическое тело, структура таблицы должна быть фиксированной и доступной на момент обращения. но зачем эту таблицу дропать в остальное время?
В 100% случаев, если вопрошающий не умеет работать с динамикой, эта динамика ему не нужна.
21 окт 15, 14:08    [18307492]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
feagooor
Guest
Обращайся в динамическом SQLe
DECLARE
  TYPE vtab IS TABLE OF NUMBER;
  varr vtab;
BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE test123 (id1 INTEGER)';
  execute immediate 'insert into test123 values(1)';
  execute immediate 'insert into test123 values(34534)';
  commit;
  EXECUTE IMMEDIATE 'SELECT id1 FROM test123' BULK COLLECT INTO varr; -- ошибка 
  EXECUTE IMMEDIATE 'DROP TABLE test123';
  for r in 1..varr.count loop
    DBMS_OUTPUT.PUT_LINE( varr(r));
  end loop;
END;
21 окт 15, 14:09    [18307504]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
А если мы его еще раз обернем?
Guest
feagooor
Обращайся в динамическом SQLe
зачем заворачивать sql-скрипт в статический plsql?
21 окт 15, 14:26    [18307617]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
rv2plus
Member

Откуда:
Сообщений: 28
Как вариант - чтобы изменить структуру данных, находясь на стороне клиентской софтины.
Причём сам pl/sql код новой версии хранить в табличке вида :

version script
--------- ---------------------------------------------
1 BEGIN ... EXECUTE IMMEDIATE 'CREATE ...' ... END;
2 BEGIN ... EXECUTE IMMEDIATE 'ALTER ...' ... END;
3 BEGIN ... EXECUTE IMMEDIATE 'DROP ...' ... END;

Помоему логично. Или есть более красивые варианты ?
21 окт 15, 15:06    [18307866]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
непонимайка
mcureenab
после динамического создания таблицы пакетом
еще один пакет и только ради видимости статичности? чтобы выполнять статическое тело, структура таблицы должна быть фиксированной и доступной на момент обращения.
развязка через пакет, это вариант решения. применять ли его, зависит от задачи.

"структура таблицы НЕ должна быть фиксированной". достаточно того, чтобы на этапе выполнения тело пакета могло скомпилироваться. таблицы могут отличаться наличием "лишних" полей и в какой то мере типами полей.
21 окт 15, 15:14    [18307921]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
ддлятор
Guest
rv2plus
Как вариант - чтобы изменить структуру данных, находясь на стороне клиентской софтины.
твоя софтина умеет отличать begin ... от alter ... и запрещает выполнять второе? и что дальше она делает с новой структурой?
21 окт 15, 15:25    [18307996]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
генеришь структуру - генери код.
Guest
mcureenab
достаточно того, чтобы на этапе выполнения тело пакета могло скомпилироваться.
ну а смысл-то в статическом коде с заведомо нарушаемыми зависимостями?
21 окт 15, 15:28    [18308010]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
генеришь структуру - генери код.
mcureenab
достаточно того, чтобы на этапе выполнения тело пакета могло скомпилироваться.
ну а смысл-то в статическом коде с заведомо нарушаемыми зависимостями?
когда в глубине большой программы сидит обращение к "динамическому" объекту, его изоляция в пакете позволит хранить статичный код в собранном виде. тело пакета также может создаваться динамически.

понятно, что подход относится скорее к администрированию системы или к выполнению каких то фоновых задач.

почти в любой БД время от времени меняется структура - доработки систем и т.п. это нормальное явление в IT. так что множество реальных БД можно отнести к категории "с заведомо нарушаемыми зависимостями".
21 окт 15, 15:51    [18308128]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
SY
Member

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

Наличие динамических таблиц указывает на проблемы дизайна или на проблемы выбора инструмента (реляционной БД).

SY.
21 окт 15, 15:58    [18308161]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
mcureenab,
То что система должна описывать то, чего она не знает- не повод к изменению её структуры, EAV в помощь.
21 окт 15, 16:33    [18308382]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
SY
mcureenab,

Наличие динамических таблиц указывает на проблемы дизайна или на проблемы выбора инструмента (реляционной БД).

SY.
надеюсь, у автора был чисто спортивный интерес или какая-то разовая задача.

Что касается изменения таблиц в процессе эксплуатации, то это нормальное явление. Бизнес хочет доработок сразу, а не в очередном релизе. Чем гробить производительность EAV, проще поля в таблицу добавить и в "динамическом" коде поддержать.
21 окт 15, 23:27    [18309464]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
mcureenab
Бизнес хочет доработок сразу, а не в очередном релизе. Чем гробить производительность EAV, проще поля в таблицу добавить и в "динамическом" коде поддержать.

А в чем преимущество этого подхода в сравнении с установкой обычной версии? Либо скомпилятся зависимости либо нет, зависит от архитектуры и нагрузки.
22 окт 15, 00:15    [18309569]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
mcureenab,
А по поводу того "бизнес хочет" - это вопрос к Вашему умению общаться с заказчиком.
22 окт 15, 00:18    [18309573]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой  [new]
-2-
Member

Откуда:
Сообщений: 15330
mcureenab
Что касается изменения таблиц в процессе эксплуатации, то это нормальное явление. Бизнес хочет доработок сразу, а не в очередном релизе.
внерелизные изменения допустимы, когда от простоя всех трех внутренних пользователей отсутствие прибыли компании не меняется.

mcureenab
проще поля в таблицу добавить и в "динамическом" коде поддержать.
ага, и добавлять поля тоже в "динамическом". какую прощету дает заворачивание скрипта в строковый литерал? Если это изменение функционала, тем более внежданное==не протестированное, шансы наткнуться на возможные ошибки в строковых литералах откладываются на момент, когда все уже забыли, когда, что и зачем добавляли.
22 окт 15, 01:40    [18309657]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить