在PL-SQL中,有一些奇特的新概念,比如表函数,对象,还有一些我尚未发现的概念。
但话又说回来,还有简单的代码生成(动态pl-sql),你可以立即执行#34;。
这些可以帮助代码重用。
据我所知,表函数和对象可以帮助创建模块化代码,但仍然不足以删除它的全部(也许我没有使用它们中最好的;我必须承认我的对象只包含数据现在,没有逻辑)。
另一方面,代码生成要简单得多,并且可以更多地减少重复代码。但有点难以理解代码生成逻辑背后的实际业务。
我想要模块化而不重复的代码。我应该坚持使用简单的代码生成吗?各自的优点和缺点是什么?
答案 0 :(得分:1)
动态SQL通常优于高级PL / SQL功能,如表函数,对象关系类型,数据盒式磁带,ANY *类型等。通过一些简单的提示,您可以避免动态SQL的陷阱并将其用于创建模块化系统。
高级PL / SQL功能很酷,在某些时候你必须至少使用它们。他们非常适合解决奇怪的,具体的问题。但是你几乎肯定会后悔创建一个以这些功能为中心的Oracle系统。在上述每个PL / SQL功能中,我浪费了数周或数月的生命。
动态SQL
Pro - 它始终有效。这可能很痛苦,但始终是一种让它在SQL中运行并使其快速运行的方法。
Con - 有点难以阅读和写作。
高级PL / SQL
Pro - 酷炫的功能,优雅的代码,可以完美地解决某些问题。
Con - 会在关键时刻让你失望。
如果不写小说,很难给出高级PL / SQL失败的例子。故事通常是这样的:“我们结合了A,B,C ......我们遇到了X,Y,Z ......每个人都生气了...我们花了一个月的时间重写它。”
动态SQL不一定非常糟糕。这需要一些纪律。
良好的格式化和检测。确保动态SQL看起来很漂亮,并且可以轻松打印出来进行调试。遵循良好的编程习惯 - 缩进,添加注释,使用有意义的名称等。当IDE上的“Beautifier”按钮无法帮助时,点击程序员会感到震惊。不要让任何人逃脱邋code的代码 - 只是因为它在技术上是一个字符串不应该允许任何人避免常见的样式规则。
备用引用机制。使用q
语法可以避免不断转义内容。例如,q'[I'll use single quotes if I want to!]'
代替'I''ll use single quotes if I want to!'
。
模板而不是连接。将代码写入不间断的块中,然后稍后替换动态部分。将它与q
字符串结合使用可避免代码中出现一百万个引号和管道。例如:
v_dynamic_sql_template constant varchar2(32767) :=
q'[
select a, b, $DYNAMIC_SELECT_LIST$
from table1
$DYNAMIC_JOIN_1$
where table1.a > 1
$DYNAMIC_WHERE_1$
]';
...
v_dyanmic_sql := replace(v_dynamic_sql_template, '$DYNAMIC_SELECT_LIST$', v_variable);
...
(在这个问题中,我假设您是一名中级或高级Oracle开发人员。如果您是初学者,答案可能是静态SQL语句,但您还没有 看到足够的SQL功能来实现它。)