有两种方法,如何实现这一点。首先,通过在存储过程中使用动态 SQL。像这样的东西:
PROCEDURE CR_VIEW IS
cond_str VARCHAR2...
BEGIN
...
SELECT FUNC_CON INTO cond_str FROM DUAL;
EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW ... AS SELECT ... FROM ...
WHERE ' || cond_str;
...
END CR_VIEW;
或者只是通过使用条件运算符直接将您的函数实现到创建视图语句中。例如:
CREATE OR REPLACE VIEW ... AS SELECT ... FROM ...
WHERE ((CASE WHEN (*condition on using condition*)
THEN (*your condition, returning 1 then true*) ELSE 1 END = 1) AND ...
但第二个将更难维护。
例如,您有一个订单表:
t_orders (order_id NUMBER, order_name VARCHAR2, order_sum NUMBER)
并且您想创建一个视图,它将向您显示总金额超过 100 美元的订单,但仅在每月的第一天使用此条件。然后,仅在每月第一天对 sum 使用条件的视图将如下所示:
CREATE OR REPLACE VIEW V_ORDERS AS SELECT order_name FROM t_orders
WHERE (CASE WHEN EXTRACT(day from current_date) = 1 THEN (CASE WHEN (order_sum > 100) THEN 1 ELSE 0 END) ELSE 1 END = 1)
但是,正如我所说,这是一种不好的做法,维护起来很糟糕,你实际上是在复制你的函数,在查询中生成条件。你真的应该考虑存储过程:)