gpt4 book ai didi

oracle - 在 oracle11g 中创建参数化 View

转载 作者:行者123 更新时间:2023-12-03 21:21:33 31 4
gpt4 key购买 nike

我有一个带有嵌套和左连接的大查询,并且需要从中创建一个 View ,以免从应用程序中运行它。问题是我需要日期范围和其他一些字段作为输入参数,因为每个请求的前端都会有所不同。
我刚刚查看并看到一些关于使用 SYS_CONTEXT 进行参数化 View 的帖子,并且需要确切知道如何使用 2 个参数创建 View - fromdate, todate以及我如何从应用程序调用 View 。

仅供引用,我正在使用 grails/groovy 开发应用程序。
这是我想从中创建 View 的查询..

 select 
d.dateInRange as dateval,
eventdesc,
nvl(td.dist_ucnt, 0) as dist_ucnt
from (
select
to_date(fromdate,'dd-mon-yyyy') + rownum - 1 as dateInRange
from all_objects
where rownum <= to_date(fromdate,'dd-mon-yyyy') - to_date(todate,'dd-mon-yyyy') + 1
) d
left join (
select
to_char(user_transaction.transdate,'dd-mon-yyyy') as currentdate,
count(distinct(grauser_id)) as dist_ucnt,
eventdesc
from
gratransaction, user_transaction
where gratransaction.id = user_transaction.trans_id and
user_transaction.transdate between to_date(fromdate,'dd-mon-yyyy') and to_date(todate,'dd-mon-yyyy')
group by to_char(user_transaction.transdate, 'dd-mon-yyyy'), eventdesc
) td on td.currentdate = d.dateInRange order by d.dateInRange asc

最佳答案

这里描述了上下文方法:http://docs.oracle.com/cd/B28359_01/network.111/b28531/app_context.htm

例如(示例改编自上述链接)

CREATE CONTEXT dates_ctx USING set_dates_ctx_pkg;

CREATE OR REPLACE PACKAGE set_dates_ctx_pkg IS
PROCEDURE set(d1 in date, d2 in date);
END;
/

CREATE OR REPLACE PACKAGE BODY set_dates_ctx_pkg IS
PROCEDURE set(d1 in date, d2 in date) IS
BEGIN
DBMS_SESSION.SET_CONTEXT('dates_ctx', 'd1', TO_CHAR(d1,'DD-MON-YYYY'));
DBMS_SESSION.SET_CONTEXT('dates_ctx', 'd2', TO_CHAR(d2,'DD-MON-YYYY'));
END;
END;
/

然后,在您的应用程序中设置日期:
BEGIN set_dates_ctx_pkg.set(mydate1, mydate2); END;
/

然后,查询参数:
SELECT bla FROM mytable
WHERE mydate
BETWEEN TO_DATE(
SYS_CONTEXT('dates_ctx', 'd1')
,'DD-MON-YYYY')
AND TO_DATE(
SYS_CONTEXT('dates_ctx', 'd2')
,'DD-MON-YYYY');

这种方法的优点是查询非常友好;它在运行时不涉及 DDL 或 DML,因此无需担心事务;它非常快,因为它不涉及 SQL - PL/SQL 上下文切换。

或者:

如果您无法使用上下文方法和 John 的包变量方法,另一种方法是将参数插入到表中(例如,全局临时表,如果您在同一 session 中运行查询),然后加入该表从 View 。缺点是您现在必须确保在运行查询时运行一些 DML 来插入参数。

关于oracle - 在 oracle11g 中创建参数化 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9024696/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com