Привязать переменную при создании таблицы?

Я пытаюсь создать таблицу, которая фильтруется по переменной дате в зависимости от текущей даты. Хотя я довольно новичок в Oracle и PL/SQL, я уже успешно написал несколько процедур PL/SQL для начинающих. Но мне интересно, правильно ли я использую переменную для достижения своей цели. Упрощенная версия того, что я хочу сделать:

Создайте таблицу myTable как Select * from oldTable, где Effective_date > variabledate

Возможно, это лучше сделать, используя оператор case в самом запросе, вместо того чтобы использовать оператор case для создания переменной, а затем использовать переменную в запросе. Но я думаю, что переменная будет более упорядоченной, легче читаемой и, возможно, будет работать быстрее.

Я гуглил и искал, но большая часть того, что я нахожу, пытается подсказать мне, как написать это, а не самый эффективный мой подход.

Любые мысли/предложения с благодарностью!


person DesertCoder    schedule 26.10.2015    source источник
comment
вам нужно будет изучить более сложное решение с использованием конвейерных функций. Вы можете создать таблицу во время выполнения, используя немедленное выполнение, но иметь таблицу, которая обновляется на основе переменной, невозможно. Почему бы просто не создать курсор с помощью переменной и не заполнить глобальную временную таблицу?   -  person kevinskio    schedule 26.10.2015
comment
В любом случае создание таблицы во время выполнения необычно. Это для хранения временных данных - и в этом случае, вероятно, более уместна глобальная временная таблица или коллекция? Другая мысль заключается в том, что если переменная «зависит от текущей даты» предсказуемым образом, например. trunc(sysdate) -5, возможно, у вас может быть представление, включающее этот фильтр. Зависит от того, какова ваша конечная цель и где/как вы планируете использовать свою новую таблицу. (Если это менее предсказуемо, вы можете использовать контекст для параметризации представления, но опять же зависит от того, что вы делаете...)   -  person Alex Poole    schedule 26.10.2015
comment
Спасибо за быстрые ответы. Ответы немного выше моей головы, хотя они дают мне что-то для исследований и изучения. Раньше я не использовал курсоры, поэтому я буду исследовать это. Чтобы быть более наглядным, это действительно временная таблица, и переменная date вполне предсказуема. По сути, я пишу задание, которое всегда будет использоваться в конце данного года для манипулирования данными, активными после первого числа следующего года. Однако также возможно, что в январе он будет запущен снова, чтобы собрать отставших.   -  person DesertCoder    schedule 26.10.2015
comment
Итак, нужно ли сохранять данные, которые существуют на момент их запуска, после окончания срока действия задания/сеанса? Я также не думаю, что кто-то сможет оценить эффективность вашего подхода - не знаю, с чем его сравнивают на самом деле.   -  person Alex Poole    schedule 26.10.2015
comment
Его не нужно будет консервировать. Проблема для меня в том, что я буду запускать это задание для нескольких постоянных таблиц, к которым я присоединюсь, и каждая таблица содержит десятки миллионов записей, и мои предшественники писали/не писали очень эффективно - задания выполнялись часами, прежде чем были оптимизированы. работать за 40 минут и т. д., так что здесь мало примеров для подражания. Возможно, вы правы в своей оценке, что это слишком расплывчато. Но вы дали мне кое-что для размышлений, чего я и хотел. Спасибо!   -  person DesertCoder    schedule 26.10.2015


Ответы (1)


Попробуйте также использовать динамический SQL в своей процедуре.

CREATE PROCEDURE proc_name (variabledate DATE) IS

   v_sql_stmt VARCHAR2(1000);

 BEGIN

   v_sql_stmt = 'Create Table myTable as Select * from oldTable where effective_date is > :bind_variabledate';

   EXECUTE IMMEDIATE  v_sql_stmt USING variabledate;

 END; 

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

person Sabe    schedule 26.10.2015
comment
Да, у меня так написано :-) Я просто не уверен, что это самый эффективный подход, и искал быстрый и грязный способ узнать, что сделают более опытные :-) Спасибо! - person DesertCoder; 26.10.2015