Oracle PL / SQL: динамический выбор столбца обновления / слияния - PullRequest
1 голос
/ 23 марта 2012

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

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

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

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

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

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

0 голосов
/ 23 марта 2012

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

...