Я хочу использовать отдельные столбцы в предложении WHERE на основе INPUT, полученного в хранимой процедуре.Oracle - изменение столбцов в выражении WHERE на основе ввода
Если TYPE_DEFINITION = 'SUP' затем использовать колонку ПОСТАВЩИК
Если TYPE_DEFINITION = 'CAT' затем использовать КАТ колонку
Я знаю, что могу написать два отдельных SELECT
«S с помощью a CASE
заявление, но это будет очень глупым и избыточным. Любой более чистый способ сделать это?
CREATE OR REPLACE PROCEDURE SG.STORED_PROCEDURE (
TYPE_DEFINITION IN VARCHAR2,
VALUE IN VARCHAR2,
STORELIST IN VARCHAR2)
AS
BEGIN
SELECT O.ORGNUMBER,
S.SKU,
FROM SKU S JOIN ORG O ON S.ORGID = O.ORGID
WHERE
AND O.ORGNUMBER IN (STORELIST)
AND (CASE TYPE_DEFINITION
WHEN 'SUP' THEN S.SUPPLIER = VALUE
ELSE S.CATEGORY = VALUE
END);
END;
/
Вы можете сделать это, и для одного состояния, было бы хорошо, но для что-то умеренно сложное (т. е. если есть более чем несколько условных частей логики), тогда вы можете получить некоторые фанковые планы. Моя рекомендация будет заключаться в том, что для чего-либо более трех или четырех динамических условий вы используете динамический SQL. Таким образом, вы получаете индивидуально настраиваемые планы запросов, и оптимизатор имеет больше шансов предсказать хорошие стратегии. – Ben
@Ben Спасибо, это хороший момент. Я добавил некоторую информацию о работе с плохими планами со статическим SQL и несколькими условиями. –