您好,我有一个问题,这需要我做一个选择不同的列,基于一个条件。我可以在存储过程中使用不干净的IF ELSIF子句来实现这一点,但是我想知道解决这个问题的最好方法。下面是一个更清晰的例子:
PROCEDURE notSoSmartSelect(type IN VARCHAR, a_filter IN VARCHAR
, b_filter IN VARCHAR, results OUT SYS_REFCURSER) IS
BEGIN
IF type = 'A' THEN
OPEN results FOR
SELECT a, sum(val) v FROM sample_table
GROUP BY a, ORDER BY a;
ELSIF type = 'B' THEN
OPEN results FOR
SELECT b, a, sum(val) v FROM sample_table
WHERE a = a_filter
GROUP BY b, a, ORDER BY a, b;
ELSIF type = 'C' THEN
OPEN results FOR
SELECT c, b, a, sum(val) v FROM sample_table
WHERE a = a_filter AND b = b_filter
GROUP BY c, b, a, ORDER BY a, b, c;
END IF;
END;正如您已经注意到的,在每种情况下,所使用的表都是相同的,但是使用了不同的列来获取、过滤、分组和排序。
上面的代码看起来很简单,但实际的问题有很多分支,并且有多个if-else,这使得代码非常脏。有没有一种优雅而干净的方法来解决这个问题呢?也许是动态SQL?但我似乎找不出为此编写动态sql的最好方法。提前谢谢。
发布于 2016-06-22 15:27:10
我不认为这是“不干净的”。这些查询彼此非常不同,所以我不会尝试将它们合并到一条语句中。
但是考虑到它们是如此不同(不同的列选择,不同的聚合组,不同的where子句),为什么它们都在一个过程中?如果有的话,我会将此过程设置为三个;可能是三个视图。
发布于 2016-06-22 15:41:20
这比您想尝试的动态sql方法清晰得多。如前所述,您有许多IF ELSE分支,甚至构造这么多和"TEST"这么多条件都会变得非常乏味。
在我看来,任何前端应用程序(如JAVA )都会使用您的refcursor,因此最好返回整个输出,然后从该端执行所有操作。
https://stackoverflow.com/questions/37960725
复制相似问题