Plsql 模块化代码的一些良好实践是什么?
在PL-SQL中,有一些奇特的新概念,如表函数、对象,以及我尚未发现的其他概念 但同样,也有简单的代码生成(动态pl sql),您可以“立即执行” 这些可以帮助代码重用 据我所知,表函数和对象可以帮助创建模块化代码,但仍然不足以删除整个模块化代码(也许我没有使用它们中最好的;我必须承认我的对象目前只包含数据,没有逻辑) 另一方面,代码生成要简单得多,并且可以更多地减少重复代码。但是很难理解代码生成逻辑背后的实际业务是什么Plsql 模块化代码的一些良好实践是什么?,plsql,Plsql,在PL-SQL中,有一些奇特的新概念,如表函数、对象,以及我尚未发现的其他概念 但同样,也有简单的代码生成(动态pl sql),您可以“立即执行” 这些可以帮助代码重用 据我所知,表函数和对象可以帮助创建模块化代码,但仍然不足以删除整个模块化代码(也许我没有使用它们中最好的;我必须承认我的对象目前只包含数据,没有逻辑) 另一方面,代码生成要简单得多,并且可以更多地减少重复代码。但是很难理解代码生成逻辑背后的实际业务是什么 我想要模块化的,而不是重复的代码。我应该坚持使用纯代码生成吗?每种方法的优
我想要模块化的,而不是重复的代码。我应该坚持使用纯代码生成吗?每种方法的优缺点是什么?动态SQL通常优于高级PL/SQL功能,如表函数、对象关系类型、数据盒带、任意*类型等。通过一些简单的提示,您可以避免动态SQL的陷阱,并使用它创建模块化系统 高级PL/SQL特性很酷,在某些情况下,您必须至少稍微使用它们。它们非常适合解决奇怪的特定问题。但您几乎肯定会后悔创建了一个以这些特性为中心的Oracle系统。我已经在上面的每个PL/SQL特性上浪费了数周或数月的时间 动态SQL 亲-它总是有效的。这可能很痛苦,但总有办法让它在SQL中工作并快速运行 缺点-读写起来有点难 高级PL/SQL 亲酷的功能,优雅的代码,可以完美地解决某些问题 骗局会在关键时刻让你失望 如果不写一本小说,很难给出高级PL/SQL失败的例子。故事通常是这样的:“我们结合了功能A、B、C……我们攻击了bug X、Y、Z……每个人都很生气……我们花了一个月的时间重新编写。”
动态SQL不必如此糟糕。这需要一些纪律
q
语法避免不断转义。例如,q'[如果我愿意,我将使用单引号!]
而不是“如果我愿意,我将使用单引号!”代码>
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);
...
已经看到了足够多的SQL特性来实现这一点。)所谓“代码生成”是指动态PL/SQL吗?(您提到的“executeimmediate[ly]”建议您这样做。)动态PL/SQL有它的位置,但不应该是您理所当然地使用的东西,只有当静态PL/SQL代码由于某种原因而不可能时,是的,动态plsql。我想要的并没有遵循任何建议的限制(“编译时文本未知的SQL”或“不支持作为静态SQL的SQL”);这似乎更容易满足我的需求。但是,这是一个陷阱吗?我如何不复制粘贴一个包含大量连接的巨大选择和一些内部选择,这些选择只是在这里和那里更改表名和列名?动态SQL有它的位置,但我倾向于回避它,因为a)它更难调试,b)它更难维护,c)SQL语法错误只在运行时发现。就像任何东西一样,它是一个工具,它有它的位置,但就像上面所说的托尼,它是一个你应该仔细考虑的东西,你是否真的需要使用它。也许您可以使用一组封装您所追求的逻辑的视图,或者您确实需要动态sql;你的问题中没有足够的信息让我们说。我是中级,是的。我已经开始使用表函数和对象(到目前为止只使用数据,没有太多的组合或继承),但我想知道是否应该增强我的对象(这需要时间,我感觉这会使事情变得复杂),或者删除我的对象和表函数,使用动态sql。老实说,这种模板化思想对于动态sql非常酷,因为我不想失去可读性