EXECUTE IMMEDIATE и CREATE TABLE с последующей выборкой

rv2plus
Дата: 21.10.2015 13:41:47
Люди добрые, подскажите пожалуйста, почему возникает ошибка 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;
tru55
Дата: 21.10.2015 13:46:04
На момент компиляции таблица НЕ создана. И неизвестно, будет ли она создана в runtime
AlexFF__|
Дата: 21.10.2015 13:46:43
rv2plus,

Что должно быть выполнено - должно быть скомпилено.
Добрый Э - Эх
Дата: 21.10.2015 13:46:55
rv2plus,

в момент компиляции (а имена проверяются именно в этот момент) таблицы еще не существует. уж если создал динамически, то далее везде же динамически и используй
mcureenab
Дата: 21.10.2015 13:56:43
Добрый Э - Эх
rv2plus,

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


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

но в общем, это некий изврат. может быть Global temporary table тут более уместны.
rv2plus
Дата: 21.10.2015 14:01:35
Добрый Э - Эх
rv2plus,

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


Всем БОЛЬШОЕ СПАСИБО за ответы - всё четко и ясно !
непонимайка
Дата: 21.10.2015 14:08:11
mcureenab
после динамического создания таблицы пакетом
еще один пакет и только ради видимости статичности? чтобы выполнять статическое тело, структура таблицы должна быть фиксированной и доступной на момент обращения. но зачем эту таблицу дропать в остальное время?
В 100% случаев, если вопрошающий не умеет работать с динамикой, эта динамика ему не нужна.
feagooor
Дата: 21.10.2015 14:09:37
Обращайся в динамическом 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.10.2015 14:26:47
feagooor
Обращайся в динамическом SQLe
зачем заворачивать sql-скрипт в статический plsql?
rv2plus
Дата: 21.10.2015 15:06:12
Как вариант - чтобы изменить структуру данных, находясь на стороне клиентской софтины.
Причём сам pl/sql код новой версии хранить в табличке вида :

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

Помоему логично. Или есть более красивые варианты ?