Sql server 因为SQL Server没有';如果没有软件包,程序员会如何绕过它?
我有一个SQL Server数据库,它有大量的存储过程。由于Oracle的“包”功能,大量存储过程在我的Oracle数据库中不是问题Sql server 因为SQL Server没有';如果没有软件包,程序员会如何绕过它?,sql-server,oracle,packages,Sql Server,Oracle,Packages,我有一个SQL Server数据库,它有大量的存储过程。由于Oracle的“包”功能,大量存储过程在我的Oracle数据库中不是问题 程序员如何才能避免Oracle这样的“包”功能的缺乏呢?想出一个好的命名约定,使用它,并实施它。虽然SQL Server没有像您习惯的那样通过封装和包状态这样的“酷特性”来提供任何东西,您可以将存储过程组织到架构中 在EnterpriseManager中,这些进程仍然列在一起,如果您有数百个进程,这将成为一个巨大的树列表。我也很怀念Oracle软件包的组织和酷特性
程序员如何才能避免Oracle这样的“包”功能的缺乏呢?想出一个好的命名约定,使用它,并实施它。虽然SQL Server没有像您习惯的那样通过封装和包状态这样的“酷特性”来提供任何东西,您可以将存储过程组织到架构中 在EnterpriseManager中,这些进程仍然列在一起,如果您有数百个进程,这将成为一个巨大的树列表。我也很怀念Oracle软件包的组织和酷特性。然而,所有平台都有自己的优势
注意:使用.NET语言编写存储过程确实会提供封装和状态。然而,它仍然没有以任何特殊的方式在EM树视图中将它们分开。模式可用于组织存储过程和其他对象。就我个人而言,当模式按功能区域组织对象时,以及当这些功能区域对应于安全边界时,我更喜欢使用模式。AdventureWorks示例数据库就是一个例子,其中包含“HumanResources”和“Sales”等模式。该理论认为,给定用户可能需要访问“人力资源”中的对象,但可能不需要访问“销售”信息 另一种方法是使用命名约定并加以实施,正如上面James所说。我要补充的是,SQLServerManagementStudio有一个过滤器按钮,可用于过滤显示的对象列表。例如,您可以单击“存储过程”文件夹并筛选包含“添加”的名称 在我当前的项目中,我从SSIS包中提取了许多SQL查询,并将它们放入存储过程中。为了区分这些存储过程和应该通用的存储过程,我在名称前面加了“ssis”。如果我能在C语言或C++中创建类似于命名空间的东西,创建“SSIS SelectUserLookupData”,而不是“SSISSLeTuxUrSeroUpDATA”,那肯定会更愉快。如果这些名称空间可以嵌套就更好了
如果这是Oracle软件包的特点之一,那么也许有人会让我知道。我要感谢我的幸运星,SQL Server没有软件包。甲骨文软件包很烂 嗯,我们需要一种方法把所有这些程序放在一个地方。我知道!让我们让开发人员为每个包创建和维护两个文件。他们将永远爱我们
只要微软从来没有像Oracle那样实现过软件包,在我看来这将是一场胜利 编辑评论: Oracle包只是一种将存储过程组织到包中的方法,这样您就不会有100个存储过程,而可能有5个包。它们不像Java或C代码中的包那样可堆叠。所有包都处于同一级别 一个包需要两个文件:headers文件和body文件。在向现有包中添加新过程时,这会产生挫折感,因为如果不添加标题,就无法添加正文,即使它包含与正文中完全相同的信息 例如,下面是我的一个包的头文件中的一个片段:
PROCEDURE bulk_approve_events
(
i_last_updated_by IN VARCHAR2,
o_event OUT NUMBER
);
下面是身体中相应的程序:
PROCEDURE bulk_approve_events
(
i_last_updated_by IN VARCHAR2,
o_event OUT NUMBER
) IS
...
BEGIN
...
END;
没有区别。头文件是无用的,只是开发人员在使用包进行开发时要跨越的另一个障碍。在我的项目中,我们有一个惯例,即每个过程的所有注释文档都放在标题中,以及添加时间和添加人的详细信息,但也可以很容易地包含在正文中。我与SQL Server和Oracle一起工作过,因此我看到了两者的优缺点。由于上面的评论有点激烈,我会尽量保持中立 那么,什么是Oracle软件包?把它想象成一个数据库类 包有两个元素:头文件和主体文件。头文件是您的公共接口,包含所有可直接调用的存储过程或函数(在Oracle中,函数返回值,存储过程不返回值)的签名(名称、参数和返回类型,如果适用)。包体必须实现包头文件中的所有过程签名 包的body元素包含所有实际执行工作的存储过程和逻辑。您可以在包头中声明一个Save过程,该过程调用正文中存在的insert或update过程。开发人员只能看到“保存”过程。重要的是要记住,包体还可以实现包头中未声明的过程或函数,它们在包本身之外是不可访问的 我发现软件包非常有用,原因有很多: