2012-03-22 3 views
1

У меня есть таблица с данными, относящимися к нескольким моментам времени, которые я должен обновлять. Однако, чтобы сэкономить пространство и время, каждая строка в моей таблице относится к данному дню, а почасовые и ежеквартальные данные за этот день разбросаны по нескольким столбцам в этой же строке. При обновлении данных для определенного момента времени I, следовательно, необходимо выбрать столбец, который должен быть обновлен через некоторую логику программирования в моих процедурах и функциях PL/SQL.Oracle PL/SQL: динамически выбирая столбец update/merge

Есть ли способ динамически выбирать столбец или столбцы, участвующие в операции обновления/слияния, без необходимости собирать строку запроса заново каждый раз? Производительность - это проблема, и пропускная способность должна быть высокой, поэтому я не могу делать ничего плохого.

Редактировать: Я знаю о проблемах нормализации. Однако мне все же хотелось бы знать хороший способ выбора столбцов для обновления/объединения динамически и программно.

+2

Как вы указываете в своем вопросе, вы не экономить время ... Вы считали нормализацию и можете ли вы разместить описания таблиц? – Ben

+1

согласился - это звучит как проблема нормализации - получение этого права упростит ваши другие проблемы. – Randy

ответ

3

Единственный способ динамически выбрать, какой столбец или столбцы использовать для оператора DML - использовать динамический SQL. И единственный способ использовать динамический SQL - это сгенерировать инструкцию SQL, которая затем может быть подготовлена ​​и выполнена. Конечно, вы можете собрать строку более или менее эффективно, вы можете проанализировать инструкцию один раз и выполнить ее несколько раз и т. Д., Чтобы минимизировать затраты на использование динамического SQL. Но использование динамического SQL, которое работает близко к тому, что вы получите со статическим SQL, требует довольно много работы.

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

+0

Я сейчас попробую этот подход и рассмотрю возможность рассмотрения моей структуры данных. Если я закончу нормализацию своих таблиц и переформулирую свою структуру, я дам вам понять, каков мой курс действий. Спасибо всем! –

0

Один из способов сделать то, что требуется, - создать пакет со всеми возможными обновлениями (которых не так много, поскольку я только обновляю одно поле в заданное время), а затем выбираю, какой запрос использовать в зависимости от моя внутренняя логика. Это, однако, приведет к большому if/else или switch/case-like statement. Есть ли способ добиться аналогичных результатов с лучшей производительностью?

Смежные вопросы