作者:Steven Feuerstein
提高编写PL/SQL代码数量及质量的四个简单易行指导方针
我从1990年就开始编写PL/SQL代码。这意味着我已经编写了几万行的软件代码,但我确信,其中的绝大多数代码都非常拙劣,而且难以维护。
幸运地是,我发现找到并遵循编写出更好代码的新方法还为时不晚。就是在去年,我的代码质量有了显著改进;这些改进主要是由于制定了一些简单的规则,并像纪律一样加以遵守。
本文为PL/SQL新手及有经验的开发人员提出了四条建议;遵守其中任何一条,你的代码质量都会有提高。这四点建议都采纳,你可能会惊奇地猛然发现:你竟然是一个非常好的程序员,要远远超乎你的想象。
所有工作都独自完成
我们很少有人是孤立工作的;大多数PL/SQL开发工作是在相对较大的机构中进行的。但我们基本上还是在自己的小隔间里用自己的设备独自工作。几乎没有PL/SQL开发小组进行正规的代码复查或系统测试。
我不可能通过这篇文章改变你们开发小组的基本状态。因此,我仔细地选取出以下几点建议。实施其中任何一点并不需征得管理人员同意。不论你的小组是大是小,都不必让其中的每个人都赞同这些编码规则。你只需按以下建议来改变你的本人的编码方式:
1. 严格遵循命名约定,好像它们就是你的生命支柱。
2. 戒除编写SQL的嗜好:编写的SQL越少越好。
3. 使执行部分短小:告别 "意大利面条式的代码 "。
4. 找一位伙伴:非常赞同找个人来监督你的工作。
1. 遵循命名约定
如果你建立并严格遵循一套命名约定,特别是对于应用程序组件的,你就可以节省很多时间。
当然,遵循命名约定的想法并没有什么新意,你可能已经听烦了。所以我并不提出什么宏伟的命名计划,而是给出一些非常具体而明确的约定,然后证明这些约定会多么有用。
前几个月我一直在为PL/SQL开发人员设计、构建一种新工具。它名为Swyg(可以在www.swyg.com中找到),可以帮助程序员完成代码的生成、测试及重用的工作。它具有几个独特的组件。我为每个组件指定了一个由两个字母组成的缩写名称,如下所示:
SF-Swyg的基础部件
SM-Swyg的元数据
SG-Swyg的生成程序
SL-Swyg的代码库
ST-Swyg的单元测试
于是,我便遵循表1中的命名约定,同时使用这些缩写。遵循这些约定有什么好处呢?一般来讲,如果我要求一致的命名规则,我就可以更流畅更高效地编写代码。
明确地说,这些约定具有可预测性,意思是说我编写的SQL程序能生成有用的脚本。例如,通过使用表1中的约定,可以生成Swyg中所有基础包的安装脚本。执行这些工作的SQL*Plus脚本如清单1所示。这类脚本非常有用,因为它意味着我不必手动维护安装脚本。当我向Swyg方案中增加另一个表,并生成一组相关包时,我只要运行我的脚本,更新后的安装脚本便会跳出来。
2. 戒除编写SQL的嗜好
编写的SQL越少越好,这似乎与我们的直觉不太一致。对于PL/SQL开发人员来说,这是一个奇特的建议,因为PL/SQL的主要优点之一就是可以毫不费力地在代码中编写SQL语句。不过,这种简易性也是这种语言的一个致命的弱点。
可以将纯粹的SQL语句直接置于PL/SQL代码中,而无需JDBC或ODBC之类的中间层。因此,无论何时何地,PL/SQL开发人员只要需要SQL语句,他们通常就会向其应用程序代码中嵌入SQL语句。那么这样做有什么问题吗?
在PL/SQL代码中到处使用SQL语句必然会导致以下后果:
尽管实际表现不同,但同一逻辑语句仍会出现重复,从而导致过多的语法分析,且难于优化应用程序的性能。
暴露商务规则和方案。这直接在SQL语句中包含了执行商务规则的逻辑。这些规则总在变化,所以应用程序的维护成本会急剧增加。
当然,你要编写的每一个PL/SQL应用程序几乎都是基于基础表和视图的。你需要执行SQL语句。问题不在于是否执行,而是何时执行、如何执行。
如果你对数据结构进行封装,或者将它们隐藏于一个PL/SQL代码层(通常是一个代码包)之后,那么你的应用程序将会更健壮,而且你还会发现创建和维护变得更易多了。
我们来看一个简单的例子。 假定我需要编写一个处理某员工工作的程序。第一件事是获取该员工的全名,定义为 "姓名逗号(,)姓 ";然后我可以进行详细分析。清单2给出了这种情况下我很可能要编写的这类代码的一个示例。
一切似乎都是这么简单和直接;这些代码可能会有什么错误呢?实际上真是非常糟糕。最主要的是我暴露了一个商务规则:全名的结构。我可能要花费数小时来对此代码及其所基于的应用程序进行测试。但就在它刚刚投入使用时,我才知道客户会不断地打电话告诉我,实际上,他们的全名应该表示为 "名空格姓 "。
现在怎么办?搜索所有位于引号内的单个逗号?
现实的解决方案是使用隐藏所有细节、只提供一组预定义、预测试及预优化并能完成所有任务的程序包。清单3为基于封装代码重新编写的 process_employee过程。hr_employee_tp包提供了用于定义保存姓名的局部变量的类型;hr_employee_rp包含有基于一种商务规则而返回全名的函数。
将显示PL/SQL语句灌入SQL代码很容易,同样,谈论封装这些语句是如何重要也不费劲。但另一方面,编写执行封装任务的代码却具有挑战性;甚至是不现实的。生成这些包或许更有意义。
几年前,我曾帮助构建这样一个生成程序。该程序段为PL/Generator,现在由Quest Software公司拥有,PL/SQL开发社区可以免费使用。你可以从我的网站www.StevenFeuerstein.com/puter /gencentral.htm下载。要知道,其封装体系结构与我在前面所概括的约定不同。PL/Generator创建了一个单独的包,它包含了一个表的类型、查询和变化逻辑的全部内容。
当你不再编写太多的SQL,而是调用执行SQL的程序时,无论你是生成还是编写自己的定制封装,你的应用程序都会受益匪浅。
3. 使执行部分短小
面对现实吧:总是与我们的判断和最新的一系列新年决议相左,我们必须停止编写意大利面条式的代码:庞大而冗长,人们实际上不可能理解它们,更不用说维护或升级了。怎样才能避免 "意大利面条 "呢?
实际上,答案很简单:决不允许执行部分超过50或60行。这种大小使你能在一页纸或一个屏幕上查看该代码块的整个逻辑结构,这也意味着你可以真实地领会该程序的意图,而且完全凭直觉就能理解它。
你可能非常同意上述观点,但同时又嘲笑我的建议:程序代码永远不超过50行。没错,你应当嘲笑,因为这当然是不可能的。毫无疑问,你需要超过50行的可执行代码;问题是你把这些代码放在哪,以及你怎样加以组织。
如果采取以下做法,你的确能够应对各种复杂的要求,并把代码限制在50行以内:
将所有的商务规则和离散逻辑块置于其自已的程序(通常是函数)中,从而在任何可能的时候慎重地重用代码。
尽量使用在程序的声明部分定义的局部模块、过程和函数。
假定我在编制一个呼叫中心应用程序。我需要编写一个程序,它要满足下面的要求:
"对于特定部门的每个员工,将其工作量(分派给该员工的呼叫次数)同该部门员工的平均工作量进行比较。如果某员工的工作量低于平均工作量,便将下一待处理呼叫分派给此人,并基于这种情况安排约定。 "
我从以前的工作中获悉:我的朋友Claudia已经编写了一个分析包,它会返回工作量方面的信息。但是分派待处理呼叫和安排约定都是全新的工作,需求文档的其余部分对此进行了详细说明。
最初我想把这15页的内容全都看完,但我没有那样做。我使用了一种称为 "逐步求精法 "或 "由顶向下设计 "的技术,并先编写了清单4中的代码来实现该程序。
下面给出了清单4中最关键代码行的解释;由该程序(紧凑的执行部分)的最后开始,向上进行。这似乎有悖于直觉,但这的确是通读用逐步求精法编写的程序的最好方式。
第22~30行。用一个游标FOR循环(cursor FOR loop)来对指定部门的所有员工进行迭代处理。在第24~25行,利用分析包中的程序判定当前的员工是否工作量不足。在第27~28行,调用三个程序:assign_next_open_case、schedule_case和next_appointment。我还不知道怎样实现这些程序,但我知道它们通过其名称和参数表表达了需要事先完成的工作。
第10~19行。为第27~28行中的三个程序创建 "stub ",也就是占位程序。注意,它们是局部模块,在assign_workload中进行定义,且不能从其他任何程序调用。
第5~8行。定义一个游标,以获得指定部门的所有员工。现在可以设法编译此代码。
对这样一个小程序成功完成编译好像是个小胜利,也的确如此。完成正确编译,然后是简单测试,然后增加一点代码,再进行正确编译,以此类推,诸如此类的小胜利缔造出构造精良的程序,而且会非常满意。
我还可以验证该分析程序是有效的,并且找出了要分派的任务适当雇员。这些工作全部完成后,我将从三个程序中挑出一个,比如 assign_next_open_case,进行下一步或下一级别的精细设计。我要阅读该任务的文档,并在assign_next_open_case 里编写一个简短的执行部分,它可反映该任务的概况。
很快,我的局部过程有了它自己的局部过程和函数,但在该过程的每一步,我的代码都很短、可读、易于测试、可根据需要进行调整。
4. 找一位好伙伴
计算机并不会编程,人才会。
有多少次你弯着腰、驼着背坐在计算机前,因无法找出代码中的错误而感到非常郁闷?先是几分钟过去了,接着又过了几小时。最后,对自己都厌烦了,感到非常失败,你把头伸出你的小隔间并请朋友过来帮你看一看。
通常会有下面三种情况之一出现:
当你的朋友从她的椅子上站起来时,一切都在瞬间变得非常清楚。
你的朋友瞥了一眼屏幕,马上就指出了问题所在。
你的朋友不负责该系统中你所做的部分,所以你必须说明你的程序在干什么。当你逐步讲解逻辑时,引起错误的问题所在会突然暴露在你面前。
事实就是自己很难调试自己的代码,因为你自己对它太投入、太专注了。 下一步
阅读
Oracle数据库10g的更多信息
oracle.com/database
Feuerstein的更多文章
otn.oracle.com/oramag/webcolumns/2003
这个问题最好的解决办法是由开发经理创造这样一种文化:各种想法是共享的、不懂是可以原谅的并不会受到处罚、定期进行建设性的代码评审。不幸的是,这些文化上的改变是难以实现的。
与此同时,我建议在帮助改变你所在小组的文化的过程中你应起带头作用。找到另一位开发人员,最好比你经验丰富,并建立一种 "伙伴 "关系:在出现问题时,他可以充当你的参谋,当然,你也可以充当他的参谋。事前达成共识:不知道所有问题的答案并没有什么不对。
然后为你自己制定一条简单的规则:不要为一个错误苦思冥想超过半个小时。30分钟过去后,把你的伙伴叫过来,让人类心理学为你服务,而不是跟你作对。
获得一种新工作方式的四个步骤
本文为你提供了可以采取的用于改变你的编程体验四个步骤,而无须投资新的工具或改变整个小组的工作流程。这四步甚至可以不全部遵循,只要遵守一步都会让你受益。
Steven Feuerstein (steven@stevenfeuerstein.com) 是PL/SQL语言方面的一位权威人士。Feuerstein撰写了9本有关PL/SQL (全部由O 'Reilly & Associates出版公司出版)的书籍,其中包括《Oracle PL/SQL最佳实践(Oracle PL/SQL Best Practices)》和《Oracle PL/SQL编程(Oracle PL/SQL Programming)》。他还是Quest Software公司的资深技术顾问。
对象 名称结构 注释 生成(DDL)文件
表 <abbrev> _ <entity> 表名,如SM_TASK,用于在普通的Mentat组件中定义的任务。 <abbrev> _ <entity> .tab
主键列 id 标准是:(几乎)每个表都包含一个按一个序列生成的id列。对于交叉表等有一些例外。 N/A
用于生成主键的序列 <abbrev> _ <entity> _seq 用于一个表主键的序列名,如SG_SCRIPT_SEQ,它为Mentat产生脚本表生成一个新主键。 <abbrev> _ <entity> .seq
查询封装包 <abbrev> _ <entity> _qp 包含用以在基础表(如SL_SOURCE_QP)中检索数据的标准API,它有助于在Mentat可重用库中查询各元素的源代码。 说明: <abbrev> _ <entity> _qp.pks
主体: <abbrev> _ <entity> _qp.pkb
改变封装包 <abbrev> _ <entity> _cp 包含用以改变(INSERT、UPDATE、DELETE)某基础表(如ST_UNITTEST_CP)中的数据的标准API,它使我能够维护单元测试定义。 说明: <abbrev> _ <entity> _cp.pkb
主体: <abbrev> _ <entity> _cp.pks
类型封装包 <abbrev> _ <entity> _tp 包含用于指定表(如SG_GEN_RUN_TP)的预定义类型--包括集合、REF CURSORS、记录。 说明: <abbrev> _ <entity> _tp.pks
主体:NA (type definitions do not need a package body)
规则封装包 <abbrev> _ <entity> _rp 包含程序,通常是函数,它隐藏了关系到该实体的商务规则的细节。 说明: <abbrev> _ <entity> _rp.pks
主体: <abbrev> _ <entity> _rp.pkb
其他物件包 <abbrev> _ <entity> _xp 包含特定实体的自定义逻辑。 说明: <abbrev> _ <entity> _xp.pks
主体: <abbrev> _ <entity> _xp.pkb
提高编写PL/SQL代码数量及质量的四个简单易行指导方针
我从1990年就开始编写PL/SQL代码。这意味着我已经编写了几万行的软件代码,但我确信,其中的绝大多数代码都非常拙劣,而且难以维护。
幸运地是,我发现找到并遵循编写出更好代码的新方法还为时不晚。就是在去年,我的代码质量有了显著改进;这些改进主要是由于制定了一些简单的规则,并像纪律一样加以遵守。
本文为PL/SQL新手及有经验的开发人员提出了四条建议;遵守其中任何一条,你的代码质量都会有提高。这四点建议都采纳,你可能会惊奇地猛然发现:你竟然是一个非常好的程序员,要远远超乎你的想象。
所有工作都独自完成
我们很少有人是孤立工作的;大多数PL/SQL开发工作是在相对较大的机构中进行的。但我们基本上还是在自己的小隔间里用自己的设备独自工作。几乎没有PL/SQL开发小组进行正规的代码复查或系统测试。
我不可能通过这篇文章改变你们开发小组的基本状态。因此,我仔细地选取出以下几点建议。实施其中任何一点并不需征得管理人员同意。不论你的小组是大是小,都不必让其中的每个人都赞同这些编码规则。你只需按以下建议来改变你的本人的编码方式:
1. 严格遵循命名约定,好像它们就是你的生命支柱。
2. 戒除编写SQL的嗜好:编写的SQL越少越好。
3. 使执行部分短小:告别 "意大利面条式的代码 "。
4. 找一位伙伴:非常赞同找个人来监督你的工作。
1. 遵循命名约定
如果你建立并严格遵循一套命名约定,特别是对于应用程序组件的,你就可以节省很多时间。
当然,遵循命名约定的想法并没有什么新意,你可能已经听烦了。所以我并不提出什么宏伟的命名计划,而是给出一些非常具体而明确的约定,然后证明这些约定会多么有用。
前几个月我一直在为PL/SQL开发人员设计、构建一种新工具。它名为Swyg(可以在www.swyg.com中找到),可以帮助程序员完成代码的生成、测试及重用的工作。它具有几个独特的组件。我为每个组件指定了一个由两个字母组成的缩写名称,如下所示:
SF-Swyg的基础部件
SM-Swyg的元数据
SG-Swyg的生成程序
SL-Swyg的代码库
ST-Swyg的单元测试
于是,我便遵循表1中的命名约定,同时使用这些缩写。遵循这些约定有什么好处呢?一般来讲,如果我要求一致的命名规则,我就可以更流畅更高效地编写代码。
明确地说,这些约定具有可预测性,意思是说我编写的SQL程序能生成有用的脚本。例如,通过使用表1中的约定,可以生成Swyg中所有基础包的安装脚本。执行这些工作的SQL*Plus脚本如清单1所示。这类脚本非常有用,因为它意味着我不必手动维护安装脚本。当我向Swyg方案中增加另一个表,并生成一组相关包时,我只要运行我的脚本,更新后的安装脚本便会跳出来。
2. 戒除编写SQL的嗜好
编写的SQL越少越好,这似乎与我们的直觉不太一致。对于PL/SQL开发人员来说,这是一个奇特的建议,因为PL/SQL的主要优点之一就是可以毫不费力地在代码中编写SQL语句。不过,这种简易性也是这种语言的一个致命的弱点。
可以将纯粹的SQL语句直接置于PL/SQL代码中,而无需JDBC或ODBC之类的中间层。因此,无论何时何地,PL/SQL开发人员只要需要SQL语句,他们通常就会向其应用程序代码中嵌入SQL语句。那么这样做有什么问题吗?
在PL/SQL代码中到处使用SQL语句必然会导致以下后果:
尽管实际表现不同,但同一逻辑语句仍会出现重复,从而导致过多的语法分析,且难于优化应用程序的性能。
暴露商务规则和方案。这直接在SQL语句中包含了执行商务规则的逻辑。这些规则总在变化,所以应用程序的维护成本会急剧增加。
当然,你要编写的每一个PL/SQL应用程序几乎都是基于基础表和视图的。你需要执行SQL语句。问题不在于是否执行,而是何时执行、如何执行。
如果你对数据结构进行封装,或者将它们隐藏于一个PL/SQL代码层(通常是一个代码包)之后,那么你的应用程序将会更健壮,而且你还会发现创建和维护变得更易多了。
我们来看一个简单的例子。 假定我需要编写一个处理某员工工作的程序。第一件事是获取该员工的全名,定义为 "姓名逗号(,)姓 ";然后我可以进行详细分析。清单2给出了这种情况下我很可能要编写的这类代码的一个示例。
一切似乎都是这么简单和直接;这些代码可能会有什么错误呢?实际上真是非常糟糕。最主要的是我暴露了一个商务规则:全名的结构。我可能要花费数小时来对此代码及其所基于的应用程序进行测试。但就在它刚刚投入使用时,我才知道客户会不断地打电话告诉我,实际上,他们的全名应该表示为 "名空格姓 "。
现在怎么办?搜索所有位于引号内的单个逗号?
现实的解决方案是使用隐藏所有细节、只提供一组预定义、预测试及预优化并能完成所有任务的程序包。清单3为基于封装代码重新编写的 process_employee过程。hr_employee_tp包提供了用于定义保存姓名的局部变量的类型;hr_employee_rp包含有基于一种商务规则而返回全名的函数。
将显示PL/SQL语句灌入SQL代码很容易,同样,谈论封装这些语句是如何重要也不费劲。但另一方面,编写执行封装任务的代码却具有挑战性;甚至是不现实的。生成这些包或许更有意义。
几年前,我曾帮助构建这样一个生成程序。该程序段为PL/Generator,现在由Quest Software公司拥有,PL/SQL开发社区可以免费使用。你可以从我的网站www.StevenFeuerstein.com/puter /gencentral.htm下载。要知道,其封装体系结构与我在前面所概括的约定不同。PL/Generator创建了一个单独的包,它包含了一个表的类型、查询和变化逻辑的全部内容。
当你不再编写太多的SQL,而是调用执行SQL的程序时,无论你是生成还是编写自己的定制封装,你的应用程序都会受益匪浅。
3. 使执行部分短小
面对现实吧:总是与我们的判断和最新的一系列新年决议相左,我们必须停止编写意大利面条式的代码:庞大而冗长,人们实际上不可能理解它们,更不用说维护或升级了。怎样才能避免 "意大利面条 "呢?
实际上,答案很简单:决不允许执行部分超过50或60行。这种大小使你能在一页纸或一个屏幕上查看该代码块的整个逻辑结构,这也意味着你可以真实地领会该程序的意图,而且完全凭直觉就能理解它。
你可能非常同意上述观点,但同时又嘲笑我的建议:程序代码永远不超过50行。没错,你应当嘲笑,因为这当然是不可能的。毫无疑问,你需要超过50行的可执行代码;问题是你把这些代码放在哪,以及你怎样加以组织。
如果采取以下做法,你的确能够应对各种复杂的要求,并把代码限制在50行以内:
将所有的商务规则和离散逻辑块置于其自已的程序(通常是函数)中,从而在任何可能的时候慎重地重用代码。
尽量使用在程序的声明部分定义的局部模块、过程和函数。
假定我在编制一个呼叫中心应用程序。我需要编写一个程序,它要满足下面的要求:
"对于特定部门的每个员工,将其工作量(分派给该员工的呼叫次数)同该部门员工的平均工作量进行比较。如果某员工的工作量低于平均工作量,便将下一待处理呼叫分派给此人,并基于这种情况安排约定。 "
我从以前的工作中获悉:我的朋友Claudia已经编写了一个分析包,它会返回工作量方面的信息。但是分派待处理呼叫和安排约定都是全新的工作,需求文档的其余部分对此进行了详细说明。
最初我想把这15页的内容全都看完,但我没有那样做。我使用了一种称为 "逐步求精法 "或 "由顶向下设计 "的技术,并先编写了清单4中的代码来实现该程序。
下面给出了清单4中最关键代码行的解释;由该程序(紧凑的执行部分)的最后开始,向上进行。这似乎有悖于直觉,但这的确是通读用逐步求精法编写的程序的最好方式。
第22~30行。用一个游标FOR循环(cursor FOR loop)来对指定部门的所有员工进行迭代处理。在第24~25行,利用分析包中的程序判定当前的员工是否工作量不足。在第27~28行,调用三个程序:assign_next_open_case、schedule_case和next_appointment。我还不知道怎样实现这些程序,但我知道它们通过其名称和参数表表达了需要事先完成的工作。
第10~19行。为第27~28行中的三个程序创建 "stub ",也就是占位程序。注意,它们是局部模块,在assign_workload中进行定义,且不能从其他任何程序调用。
第5~8行。定义一个游标,以获得指定部门的所有员工。现在可以设法编译此代码。
对这样一个小程序成功完成编译好像是个小胜利,也的确如此。完成正确编译,然后是简单测试,然后增加一点代码,再进行正确编译,以此类推,诸如此类的小胜利缔造出构造精良的程序,而且会非常满意。
我还可以验证该分析程序是有效的,并且找出了要分派的任务适当雇员。这些工作全部完成后,我将从三个程序中挑出一个,比如 assign_next_open_case,进行下一步或下一级别的精细设计。我要阅读该任务的文档,并在assign_next_open_case 里编写一个简短的执行部分,它可反映该任务的概况。
很快,我的局部过程有了它自己的局部过程和函数,但在该过程的每一步,我的代码都很短、可读、易于测试、可根据需要进行调整。
4. 找一位好伙伴
计算机并不会编程,人才会。
有多少次你弯着腰、驼着背坐在计算机前,因无法找出代码中的错误而感到非常郁闷?先是几分钟过去了,接着又过了几小时。最后,对自己都厌烦了,感到非常失败,你把头伸出你的小隔间并请朋友过来帮你看一看。
通常会有下面三种情况之一出现:
当你的朋友从她的椅子上站起来时,一切都在瞬间变得非常清楚。
你的朋友瞥了一眼屏幕,马上就指出了问题所在。
你的朋友不负责该系统中你所做的部分,所以你必须说明你的程序在干什么。当你逐步讲解逻辑时,引起错误的问题所在会突然暴露在你面前。
事实就是自己很难调试自己的代码,因为你自己对它太投入、太专注了。 下一步
阅读
Oracle数据库10g的更多信息
oracle.com/database
Feuerstein的更多文章
otn.oracle.com/oramag/webcolumns/2003
这个问题最好的解决办法是由开发经理创造这样一种文化:各种想法是共享的、不懂是可以原谅的并不会受到处罚、定期进行建设性的代码评审。不幸的是,这些文化上的改变是难以实现的。
与此同时,我建议在帮助改变你所在小组的文化的过程中你应起带头作用。找到另一位开发人员,最好比你经验丰富,并建立一种 "伙伴 "关系:在出现问题时,他可以充当你的参谋,当然,你也可以充当他的参谋。事前达成共识:不知道所有问题的答案并没有什么不对。
然后为你自己制定一条简单的规则:不要为一个错误苦思冥想超过半个小时。30分钟过去后,把你的伙伴叫过来,让人类心理学为你服务,而不是跟你作对。
获得一种新工作方式的四个步骤
本文为你提供了可以采取的用于改变你的编程体验四个步骤,而无须投资新的工具或改变整个小组的工作流程。这四步甚至可以不全部遵循,只要遵守一步都会让你受益。
Steven Feuerstein (steven@stevenfeuerstein.com) 是PL/SQL语言方面的一位权威人士。Feuerstein撰写了9本有关PL/SQL (全部由O 'Reilly & Associates出版公司出版)的书籍,其中包括《Oracle PL/SQL最佳实践(Oracle PL/SQL Best Practices)》和《Oracle PL/SQL编程(Oracle PL/SQL Programming)》。他还是Quest Software公司的资深技术顾问。
对象 名称结构 注释 生成(DDL)文件
表 <abbrev> _ <entity> 表名,如SM_TASK,用于在普通的Mentat组件中定义的任务。 <abbrev> _ <entity> .tab
主键列 id 标准是:(几乎)每个表都包含一个按一个序列生成的id列。对于交叉表等有一些例外。 N/A
用于生成主键的序列 <abbrev> _ <entity> _seq 用于一个表主键的序列名,如SG_SCRIPT_SEQ,它为Mentat产生脚本表生成一个新主键。 <abbrev> _ <entity> .seq
查询封装包 <abbrev> _ <entity> _qp 包含用以在基础表(如SL_SOURCE_QP)中检索数据的标准API,它有助于在Mentat可重用库中查询各元素的源代码。 说明: <abbrev> _ <entity> _qp.pks
主体: <abbrev> _ <entity> _qp.pkb
改变封装包 <abbrev> _ <entity> _cp 包含用以改变(INSERT、UPDATE、DELETE)某基础表(如ST_UNITTEST_CP)中的数据的标准API,它使我能够维护单元测试定义。 说明: <abbrev> _ <entity> _cp.pkb
主体: <abbrev> _ <entity> _cp.pks
类型封装包 <abbrev> _ <entity> _tp 包含用于指定表(如SG_GEN_RUN_TP)的预定义类型--包括集合、REF CURSORS、记录。 说明: <abbrev> _ <entity> _tp.pks
主体:NA (type definitions do not need a package body)
规则封装包 <abbrev> _ <entity> _rp 包含程序,通常是函数,它隐藏了关系到该实体的商务规则的细节。 说明: <abbrev> _ <entity> _rp.pks
主体: <abbrev> _ <entity> _rp.pkb
其他物件包 <abbrev> _ <entity> _xp 包含特定实体的自定义逻辑。 说明: <abbrev> _ <entity> _xp.pks
主体: <abbrev> _ <entity> _xp.pkb
发表评论
-
【转】PLSQL批量Forall操作性能提升详解
2013-07-24 18:14 670通常在SQL语句中给PL/SQL变量赋值叫做绑定(Bindin ... -
piner整理的关于Oracle的 FAQ
2013-03-20 14:36 405http://www.itpub.net/thread-180 ... -
唯一索引的索引键不保存rowid
2013-03-19 16:01 918tom的oracle 9i&10g编程艺 ... -
tnsnames.ora设置怪问题
2012-11-05 11:50 694tnsnames.ora设置怪问题 刚搞定困扰3天的orac ... -
Oracle LOAD批量写入数据
2012-09-21 10:39 623生产线数据库只有查询权限,需要从生产线下50W数据导入研发线, ... -
超好用的plsql设置
2012-09-21 10:39 9481、格式化SQL语句 在使 ... -
第一次和第二次的执行计划为啥不一样
2012-09-21 10:39 715下面的sql执行了两次,发现两次的执行计划有不一致的地方。re ... -
oracle 10g如何关闭和打开自动收集统计信息
2012-09-20 10:41 688一、ORACLE10g自动收集统计信息--自动analyze ... -
什么是INDEX SKIP SCAN
2012-09-20 10:40 963在查看SQL的执行计划的时候,有时候会看到INDEX SKIP ... -
oracle 物理读 逻辑读的理解
2012-09-20 10:38 744逻辑读是指从内存中读,物理读是指从磁盘上读取数据 ... -
oracle版本说明及主要特性
2012-09-20 10:37 7571983年3月,oracle第3版,引入事务的概念, ...
相关推荐
在编写PL/SQL代码时,应遵循一些命名约定和编码规范,以提高代码的可读性和可维护性。例如,变量名、过程名、函数名等应该有意义,并遵循一定的命名规则。使用游标时,应确保游标正确打开和关闭,以及游标中的数据...
14. **最佳实践和编码规范**:学习编写清晰、可读且可维护的PL/SQL代码的方法,遵循良好的编程风格和设计原则。 通过这个Oracle PL/SQL Fundamentals教程,学员将具备编写和调试高效、可靠PL/SQL代码的能力,从而更...
9. **PL/SQL风格指南**:遵循一致的编码风格,如变量命名规则、缩进风格等。使用PL/SQL格式化工具如SQL Developer或Toad进行代码美化。 10. **代码复用**:利用PL/SQL的集合类型和游标,减少代码重复。使用`...
下面将详细介绍PL/SQL编码规范的主要方面,以及与之相关的Oracle命名标准、数据库设计指南和缩写词汇表。 首先,PL/SQL编码规范主要涵盖以下几个方面: 1. **命名规范**:遵循一致且有意义的命名规则至关重要。...
- **命名规则**: 建议使用有意义的名称,并遵循 Oracle 的命名规范。 ##### 3.3 修改程序 - **编辑**: 直接在编辑器中对源代码进行修改。 - **版本控制**: 如果启用了版本控制系统,则可以在 PL/SQL Developer 中...
### PL/SQL编程 #### PL/SQL程序设计简介 **PL/SQL**(Procedure Language for SQL)是一种专门针对Oracle数据库设计的过程化语言。它结合了SQL的数据操纵能力与传统过程化语言的流程控制功能,使得开发者能够编写...
**PL/SQL Developer详解** PL/SQL Developer是一款专为Oracle数据库设计的强大集成开发环境(IDE),它由Allround ...无论是进行数据库设计、编码、测试还是维护,PL/SQL Developer都是一个值得信赖的工具。
PL/SQL Developer是一款由Allround Automations公司开发的专门针对Oracle数据库进行编程和管理的集成开发环境(IDE)。它提供了一个高效、用户友好的界面,用于编写、调试、执行和管理PL/SQL代码,是Oracle数据库...
在安装7.1简体中文语言包的过程中,用户需要注意的是,要确保已经正确安装了PL/SQL Developer的主程序,并且在安装语言包时,要遵循安装向导的指示,选择与主程序版本匹配的语言包,以避免兼容性问题。安装完成后,...
PL/SQL Developer是一款专为Oracle数据库设计的集成开发环境,由Allround Automations公司开发,主要用于编写、调试、测试和管理PL/SQL代码。这款工具以其高效、易用的特性深受数据库管理员和开发人员的喜爱。在提供...
PL/SQL Developer是一款由Allround Automations公司开发的集成开发环境(IDE),专门用于Oracle数据库的PL/SQL编程。此“PL/SQL Developer 12 语言包”是该软件的汉化版本,旨在为中文用户提供了更友好的界面和更...
### Oracle PL/SQL最佳实践概览 #### 一、引言 自从1994年史蒂文·菲厄斯坦(Steven Feuerstein)开始撰写关于Oracle PL/SQL语言的文章以来,该领域的信息来源已经从最初的寥寥无几发展到今天的形式多样。现在,有...
总的来说,CnPlugin作为一款专门为PL/SQL Developer设计的自动补全插件,它在Windows 10上的出色兼容性为开发者提供了流畅的编码体验,减少了编写和调试PL/SQL代码时的困扰。通过充分利用这一工具,开发人员可以更...
在编写PL/SQL程序时,需要注意PL/SQL对大小写不敏感,但建议遵循一定的编码规范以提高可读性。例如,可以将变量名和常量名用大写字母表示,而保留关键字使用小写字母。此外,PL/SQL还支持流程控制语句,如条件判断...
### PL/SQL最佳实践 #### 引言 在这一章节中,Steven Feuerstein——一位在Oracle PL/SQL领域享有盛誉的专家,提炼出了他多年编程、写作和教学的经验,形成了一系列PL/SQL“最佳实践”。这些最佳实践旨在帮助...
PL/SQL建议使用有意义的名字来命名变量、常量等,遵循一定的命名习惯,如使用下划线分隔单词等。 **五、PL/SQL标识符的作用域(scope)和可见度(visiblity)** 标识符的作用域决定了它在程序中的可见范围。全局标识符...