我有一个SQL Server数据库,存储过程大量增加.由于Oracle"包"功能,我的Oracle数据库中存在大量存储过程.
程序员做了什么来解决缺乏像Oracle那样的"包"功能?
The*_*edi 24
虽然SQL Server没有像您习惯的那样通过封装和封装状态的"酷炫功能"提供任何功能,但您可以将存储过程组织为模式.
在企业管理器中,如果您有数百个触发器,这些触发器仍然全部列在一起,这将成为一个巨大的树形图.我也很想念Oracle软件包的组织和很酷的功能.但是,所有平台都有自己的优势.
注意:以.NET语言编写存储过程可以为您提供封装和状态.但是它仍然没有以任何特殊的方式在EM树视图中将它们分开.
模式可用于组织存储过程和其他对象.就个人而言,我更喜欢在按功能区域组织对象时使用模式,并且这些功能区域对应于安全边界.AdventureWorks示例数据库中提供了一个示例,其中包含"HumanResources"和"Sales"等模式.理论是给定用户可能需要访问"HumanResources"中的对象,但可能不需要访问"Sales"信息.
另一种方法是使用命名约定并强制执行它,正如James上面所说的那样.我将补充说,SQL Server Management Studio有一个过滤器按钮,可用于过滤显示的对象列表.例如,可以单击"存储过程"文件夹,过滤"名称"包含"添加".
在我当前的项目中,我从SSIS包和存储过程中提取了许多SQL查询.为了区分这些存储过程和那些应该是通用的存储过程,我在名称前面添加了"ssis".如果我能在C#或C++中创建类似于命名空间的东西,并创建"SSIS.SelectUserLookupData"而不是"ssis_SelectUserLookupData",那肯定会更愉快.如果这些命名空间可以嵌套,那就更好了.
如果这是Oracle中的Packages的特色之一,那么也许有人会告诉我.
小智 5
我曾经使用过SQL Server和Oracle,所以看到了两者的好坏.由于上述评论有点激烈,我会尽量保持中性......
那么,什么是Oracle包?可以把它想象成一个数据库类
该包有两个元素:头文件和正文文件.头文件是您的公共接口,包含可直接调用的所有存储过程或函数的签名(名称,参数和返回类型,如果适用)(在Oracle中,函数返回值,存储过程不会).包体必须实现包头文件中的所有过程签名.
包的body元素包含实际执行工作的所有存储过程和逻辑.您可能在包头中声明了一个Save过程,该过程调用正文中存在的插入或更新过程.开发人员只能看到"保存"过程.重要的是要记住,包体还可以实现未在包头中声明的过程或函数,它们只是在包本身之外无法访问.
我发现包非常有用,原因有很多:
就个人而言,我会喜欢MS来实现某种包功能,因为我认为它可以创建一个更干净的数据库.