gpt4 book ai didi

Oracle 编码标准特性实现

转载 作者:行者123 更新时间:2023-12-04 07:02:24 26 4
gpt4 key购买 nike

好吧,我陷入了一种僵局。

在我的开源项目中,一个基于 .NET 的 Oracle 数据库浏览器,我实现了一堆重构工具。到现在为止还挺好。我真正希望实现的一个功能是一个大的“全局重新格式化”,它可以使代码(脚本、函数、过程、包、 View 等)符合标准。 (我一直对缺乏合适的 SQL 重构工具感到难过,并想为此做点什么。)

不幸的是,我很懊恼地发现,似乎没有任何一种广泛使用的甚至“普遍接受”的 PL-SQL 标准。这会阻碍我的实现计划。

我的搜索相当详尽。我发现了许多相互矛盾的文件、主题和文章,而且意见也相当多样化。 (在所有事情中,逗号的位置似乎引起了相当多的争论。)

所以我面临几个选择:

  • 添加一项功能,让用户可以自定义标准,然后根据该标准重新格式化代码。

  • -或者-
  • 添加一项功能,让用户可以自定义标准,并像 StyleCop 一样简单地生成违规列表,而保持 SQL 不变。

  • 在我看来,第一个选项为最终用户节省了大量工作,但存在以可能不需要的方式修改 SQL 的风险。第二个选项冒着产生大量警告并且不做任何工作的风险。 (这通常会很烦人。)

    在这两种情况下,我仍然没有标准可循。我需要从你们那里知道的是一种民意调查,但又不是。如果您打算使用这种性质的工具,您希望它警告您或修复 SQL 代码的哪些部分?

    再一次,我只是因为缺乏一个有凝聚力的标准而不知所措。鉴于没有任何由 Oracle 正式发布的内容,我认为这是社区可以权衡的事情。此外,考虑到投票对 SO 的运作方式,投票将有助于建立给定“重构”的流行度。

    附言该引擎将 SQL 解析为表达式树,因此它可以稳健地分析 SQL 并对其进行重新格式化。我们应该可以做很多事情来纠正 SQL 的格式。但我认为对于该事物的第一个版本,布局是主要关注点。尽管值得注意的是,该事物已经具有将关键字转换为大写以及将标识符转换为小写的重构。

    最佳答案

    PL/SQL 是 Ada 的衍生品,但是 Ada 的风格指南几乎与最“老派”DB 人喜欢的风格指南一样令人反感。 (你不得不认为他们的大写锁定卡住了很糟糕的那个)

    坚持使用您从 .Net 中已经知道的内容,这意味着 明智 标识符,无需将数据库的一半加密/压缩为 30 个字符。
    您可以使用字典并拆分驼峰式或下划线标识符部分并检查它们是否是真实单词。有点像 FxCop 所做的。
    不过可能有点烦人。因为一般的 Oracle 数据库拥有最残酷和最不一致的命名准则,这些准则甚至在 30 年前就已经过时了。
    所以,我认为你不会达到在你的项目(或你的用户)中到处获得干净标识符的目标

    由于 PL/SQL 不区分大小写,并且列优先于同名的本地变量,因此您必须进行更多的权衡。您可以引用其他 pascal 衍生品的风格指南(Ada 基于 Modula,后者基于 Pascal),例如 Delphi对 PL/SQL 来说感觉更接近家庭(我使用 .Net 和 Delphi 的混合)。
    尤其是参数的“aPrefix”可以挽救生命,因为您不会以这种方式与列名发生冲突:

    subtype TName is SomeTable.Name%type;
    subtype TId is SomeTable.Id%type;

    function Test(aName in TName) return TId is
    result TId;
    begin
    SELECT t.Id
    INTO result
    FROM SomeTable t
    WHERE t.Name = aName;

    return result;
    exception
    when No_Data_Found then
    return null;
    end;

    如果没有前缀,oracle 将始终选择列“名称”而不是参数“名称”。 (这很烦人,因为列可以用别名限定...)

    我将我的 PL/SQL Devloper 配置为使所有关键字都为小写,但是,我将普通 SQL 中使用的关键字设置为大写(SELECT、WHERE 等)
    结果,SQL 出现在代码之外,但并非我的所有代码都必须被所有上层关键字粗暴对待。 (无论如何,它们都被突出显示,那么完全上层的恋物癖是什么?;-))

    当您的工具能够识别普通 SQL 并提供一些视觉线索时,即使是 SQL 关键字也不需要具有不同的大小写。

    顺便说一句,我很想看看它。您可以发布一个网址,还是仍然处于“隐蔽状态”?
    干杯,
    罗伯特

    关于Oracle 编码标准特性实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1647926/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com