根据http://www.toadworld.com/Portals/0/stevenf/Say%20Goodbye%20to%20Hard-Coding.pdf,作者谈到了在PL / SQL中隐藏游标/ SQL,但我找不到它是如何完成的。有人可以通过任何简单的方法来启发它是如何完成的吗?感谢。
答案 0 :(得分:3)
Steven Feuerstein赞成将所有SQL封装在PL / SQL函数中,所以不是开发人员写的:
select ename
into v_ename
from emp
where empno = v_empno;
他们会写:
v_ename := emp_pkg.get_ename (v_empno);
SQL在emp_pkg.get_name函数的定义中“隐藏”。
我不知道他在那个演示文稿中特别提到隐藏游标的地方了吗?
有些人认为Feuerstein先生采用这种方法太过分了 - 例如Tom Kyte(以及我自己)。
答案 1 :(得分:3)
我在PL / SQL中编写SQL的立场很容易被误解,主要是因为我写的是关于它的方式!
在我看来,PL / SQL是放置SQL语句的最佳位置。问题是其中放置SQL。以下是我遵循的指导原则:在纯SQL中编写尽可能多的需求。我肯定不主张你把一个联接分成两个函数调用或类似的荒谬。我全都是为了Tom Kyte的口头禅:“在SQL中做。如果你不能用SQL做,那就用PL / SQL做。如果你不能用PL / SQL做,那就用Java做吧。” (或其他)
避免重复几乎所有事情。
如果您认为不应重复/暴露魔术值,为什么您会支持暴露SQL语句?如果您需要在此程序中获取一行数据,那么您(或您团队中的其他人)可能会再次需要它。所以把它放在一个函数中并调用函数。
但是这一步是在原则#1之后,而不是之前。你当然不会妥协性能。
一旦你完成了这种隐藏,你就可以更容易地利用函数结果缓存等功能,这只是一个例子,说明这种隐藏SQL如何使你和你的应用程序受益。
希望这可以解决一些问题。
SF
答案 2 :(得分:0)
这是一个有趣的讨论。首先,我要说的是,我同意史蒂夫·费尔斯坦在那个powerpoint中所说的大多数。我认为消除重复是一个很好的目标,对于我尝试的每个API(例如):
define constants in a single place(spec)
use types/subtypes (even in a sep package) over varchar2(xxx)
use utility functions (autonomous trans function for logs)
define custom exception handling routines in sep package
基本上,我会在这个(甚至其他)apis中反复使用的东西。
然而,我并不认为目标是将所有内容分解成最小的小块并坚持(隐藏)后面的功能。如果你这样做,你就会强迫自己忽略SQL和Oracle引擎本身的真正威力。你强迫Oracle将每个问题分解成你定义的一小部分,然后说“确定Oracle,而不是用纯SQL编写的一个连接,这里有10个函数调用我需要你做,然后组合/排序/等到给我同样的结果“......后来......”为什么这件事太慢了?“ (但至少代码看起来很漂亮)。
SF对慢速问题的回答似乎是最近出现的更多功能(如功能结果缓存)。我已经足够长时间告诉你这些会有所帮助,但仍然无法对正确编写/调优的SQL有所帮助。就我个人而言,我没有看到在PL / SQL中使用实际的SQL是多么的邪恶。对我来说,构建pl / sql api完全是关于 actions ,我希望api的用户能够做。这些函数中的每一个都很可能具有特定于该函数(或动作)的SQL。 使api正确而不是担心将所有SQL分解为一堆函数调用。我可以告诉你,如果世界上最漂亮的代码没有执行或扩展(所有这些函数调用的另一个问题),那么它最终还是会再见。
我的2美分。