2015-10-26 3 views
0

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

Создать таблицу MyTable в качестве Select * от oldTable где Effective_Date является> variabledate

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

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

Любые мысли/предложения были высоко оценены!

+1

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

+1

Создание таблицы во время выполнения является необычным в любом случае. Следует ли хранить временные данные - в этом случае, вероятно, более подходящей является глобальная временная таблица или коллекция? Другая мысль состоит в том, что если переменная «зависит от текущей даты» предсказуемым образом, например, 'trunc (sysdate) -5', вы могли бы иметь представление, которое, возможно, включает этот фильтр. Зависит от вашей конечной цели, и где/как вы планируете использовать свою новую таблицу. (Если это менее предсказуемо, вы можете использовать контекст для параметризации представления, но опять же зависит от того, что вы делаете ...) –

+0

Спасибо за быстрые ответы. Ответы немного над моей головой, хотя они дают мне кое-что для исследования и обучения. Раньше я не использовал курсоры, поэтому я буду исследовать это. Чтобы быть более описательным, это, действительно, временная таблица, а переменная дата достаточно прогностическая. По сути, я пишу работу, которая всегда будет использоваться в конце данного года, чтобы манипулировать данными, активными после первого года наступающего года. Тем не менее, также возможно, что это будет снова запущено в январе, чтобы собрать отставших. – DesertCoder

ответ

0

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

create Procedure proc_name (variabledate date) IS 

v_sql_stmt varchar2(1000); 

НАЧАТЬ

v_sql_stmt = 'Создать таблицу MyTable, как Select * из oldTable где Effective_Date является>: bind_variabledate';

EXECUTE IMMEDIATE v_sql_stmt ИСПОЛЬЗОВАНИЕ Variableate;

конец;

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

+0

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