Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 因为SQL Server没有';如果没有软件包,程序员会如何绕过它?_Sql Server_Oracle_Packages - Fatal编程技术网

Sql server 因为SQL Server没有';如果没有软件包,程序员会如何绕过它?

Sql server 因为SQL Server没有';如果没有软件包,程序员会如何绕过它?,sql-server,oracle,packages,Sql Server,Oracle,Packages,我有一个SQL Server数据库,它有大量的存储过程。由于Oracle的“包”功能,大量存储过程在我的Oracle数据库中不是问题 程序员如何才能避免Oracle这样的“包”功能的缺乏呢?想出一个好的命名约定,使用它,并实施它。虽然SQL Server没有像您习惯的那样通过封装和包状态这样的“酷特性”来提供任何东西,您可以将存储过程组织到架构中 在EnterpriseManager中,这些进程仍然列在一起,如果您有数百个进程,这将成为一个巨大的树列表。我也很怀念Oracle软件包的组织和酷特性

我有一个SQL Server数据库,它有大量的存储过程。由于Oracle的“包”功能,大量存储过程在我的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过程。开发人员只能看到“保存”过程。重要的是要记住,包体还可以实现包头中未声明的过程或函数,它们在包本身之外是不可访问的

我发现软件包非常有用,原因有很多:

  • 您已经有了可以提供给其他开发人员的公共接口的概念
  • 包可以镜像已编译的类。My Orders.Save()C#方法将调用My Oracle Orders.SaveLineItem方法来保存每个行项目,并调用Oracle SaveOrder方法来保存订单摘要详细信息
  • 我的进程在包中以一种很好的逻辑方式分组在一起
  • 就我个人而言,我希望MS能够实现某种包功能,因为我认为这有助于创建更干净的数据库

  • 正如人们所说,模式是组织数据库表和过程的一种更符合逻辑和ANSI标准的方法

  • 软件工程的最佳实践是,我们不应该直接在任何服务器上进行更改。由于所有数据库存储过程都是脚本化的,并且处于配置控制之下,所以我们可以安排这些脚本