【发布时间】:2018-03-13 06:42:41
【问题描述】:
我正在使用 Oracle 数据库并且有几个大型 SQL 查询(150 行以上)。我需要运行这些多次来执行不同的测试。为了尽量减少代码重复,我通常会使用 with 子句。例如,如果我想检查两个查询的结果是否相同并确认计数不为零,我可能会使用
WITH STATEMENT_1 AS
(
SELECT ...
)
, STATEMENT_2 AS
(
SELECT ...
)
SELECT COUNT(*) FROM STATEMENT_1
UNION ALL
SELECT COUNT(*) FROM STATEMENT_2
UNION ALL
(
SELECT COUNT(*) FROM
(
SELECT * FROM STATEMENT_1
MINUS
SELECT * FROM STATEMENT_2
)
);
这行得通。但是,我现在正在尝试创建一个 PL/SQL 包来存储和自动破坏这些查询。我正在寻找一种避免 SQL 代码重复的方法。我见过这样的答案
Reusing large SQL queries in stored procedures
CREATE OR REPLACE FUNCTION my_ugly_query()
RETURN SYS_REFCURSOR
AS
my_cursor_ref SYS_REFCURSOR;
BEGIN
OPEN my_cursor_ref FOR
SELECT -- 150+ lines of query;
RETURN my_cursor_ref;
END;
但是我不想使用游标,因为查询都是基于设置的。
总而言之:寻找一种在不使用游标的情况下将大型、重复的 SQL 基本查询封装在 PL/SQL 包中的方法。
【问题讨论】:
-
把你的那些 SQL 转换成 views 怎么样?
-
视图是封装查询的最传统方式。这能满足您的需求吗?
-
为什么不直接将结果插入带有 Id 或日期的表中,然后在函数调用后读取结果
-
什么代码重复?我不明白你想要避免的。
-
@Gordon Linoff - 例如,如果我有 150 行 SQL 查询并且我需要找到 COUNT 但后来需要在减号语句中使用相同的查询,我不想必须重复完整的 150 行查询。