Plsql 模块化代码的一些良好实践是什么?

Plsql 模块化代码的一些良好实践是什么?,plsql,Plsql,在PL-SQL中,有一些奇特的新概念,如表函数、对象,以及我尚未发现的其他概念 但同样,也有简单的代码生成(动态pl sql),您可以“立即执行” 这些可以帮助代码重用 据我所知,表函数和对象可以帮助创建模块化代码,但仍然不足以删除整个模块化代码(也许我没有使用它们中最好的;我必须承认我的对象目前只包含数据,没有逻辑) 另一方面,代码生成要简单得多,并且可以更多地减少重复代码。但是很难理解代码生成逻辑背后的实际业务是什么 我想要模块化的,而不是重复的代码。我应该坚持使用纯代码生成吗?每种方法的优

在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不必如此糟糕。这需要一些纪律

  • 良好的格式和检测。确保动态SQL看起来很漂亮,并且可以轻松打印出来进行调试。遵循良好的编程实践-缩进、添加注释、使用有意义的名称等。当IDE上的“美化器”按钮对程序员没有帮助时,这将是一个冲击。不要让任何人因为草率的代码而逍遥法外——仅仅因为它在技术上是一个字符串,就不应该允许任何人回避常见的样式规则

  • 替代报价机制。使用
    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);
    
    ...
    
  • (在这个问题中,我假设您是中级或高级Oracle开发人员。如果您是初学者,答案可能是静态SQL语句,但您没有
    已经看到了足够多的SQL特性来实现这一点。)

    所谓“代码生成”是指动态PL/SQL吗?(您提到的“executeimmediate[ly]”建议您这样做。)动态PL/SQL有它的位置,但不应该是您理所当然地使用的东西,只有当静态PL/SQL代码由于某种原因而不可能时,是的,动态plsql。我想要的并没有遵循任何建议的限制(“编译时文本未知的SQL”或“不支持作为静态SQL的SQL”);这似乎更容易满足我的需求。但是,这是一个陷阱吗?我如何不复制粘贴一个包含大量连接的巨大选择和一些内部选择,这些选择只是在这里和那里更改表名和列名?动态SQL有它的位置,但我倾向于回避它,因为a)它更难调试,b)它更难维护,c)SQL语法错误只在运行时发现。就像任何东西一样,它是一个工具,它有它的位置,但就像上面所说的托尼,它是一个你应该仔细考虑的东西,你是否真的需要使用它。也许您可以使用一组封装您所追求的逻辑的视图,或者您确实需要动态sql;你的问题中没有足够的信息让我们说。我是中级,是的。我已经开始使用表函数和对象(到目前为止只使用数据,没有太多的组合或继承),但我想知道是否应该增强我的对象(这需要时间,我感觉这会使事情变得复杂),或者删除我的对象和表函数,使用动态sql。老实说,这种模板化思想对于动态sql非常酷,因为我不想失去可读性