使用存储过程组件时插入,删除,更新

时间:2011-12-20 06:40:00

标签: oracle delphi stored-procedures

我们有一个用Delphi 2010编写的应用程序,它连接到SQL Server数据库。现在我们正在迁移到Oracle。使用SQL Server,可以非常轻松地从连接到存储过程的dbgrid执行插入,更新,删除。

这是因为SQL Server中的存储过程可以很容易地充当表,以便您可以对其执行任何操作,前提是它返回结果集中的必要列。现在使用Oracle我不知道该怎么做。我将DBGrid连接到DataSource,其数据集是Stored Procedure对象,但我无法编辑网格。可以选择Just。

我需要做些什么才能实现这一目标?我使用UniDac组件套件连接到Oracle数据库。

2 个答案:

答案 0 :(得分:3)

  1. Oracle不支持此类功能。 IOW,在Oracle中,您无法编辑存储过程提供的结果集,也不能将存储过程包含在INSERT INTO <name>UPDATE <name>DELETE FROM <name>中。
  2. 虽然SQL Server开发人员传统上“总是”使用存储过程(由于许多原因)是传统的,但对于Oracle开发人员来说,这并不常见。但是Oracle也有可能。搜索“REF CURSOR”以了解如何使用SP获取数据。并使用普通或打包(首选)SP将更新发布到数据库。这些过程将通过参数接收旧/新字段值。
  3. 我不能准确地说出UniDAC,我可以说about AnyDAC。但我希望UniDAC具有类似的功能。要使用SP发布更新,您需要使用TXxxUpdateSQL组件。

答案 1 :(得分:3)

好的,我在这里回答这个问题虽然我可以看到最近很少有人在与Delphi打交道。假设我们在Oracle数据库中有一个存储过程:

CREATE OR REPLACE PROCEDURE GET_EMPLOYEES
 (V_CUR IN OUT SYS_REFCURSOR)
AS
BEGIN
  OPEN V_CUR FOR SELECT * FROM EMPLOYEES;
END GET_EMPLOYEES;

现在,在Delphi中,您选择一个存储过程组件(可能来自ODAC或UniDac组件套件)。设置其StoredProcName GET_EMPLOYEES。然后,您可以添加过程在游标中返回的所有字段。如果您运行应用程序并激活存储过程,您将能够看到所有记录。但是,如果您尝试插入,修改或删除任何内容,您将无法执行此操作。现在,有一件非常棘手的事情。如果检查,您将看到所有字段的ReadOnly属性都设置为True。即使您将它们设置为False,在真实数据库中也不会发生任何变化,尽管您可以编辑DBGrid。

所以,我们来到主要部分。旧的Delphi-SQL Server伙伴关系是如何工作的,以便您可以直接从DBGrid进行任何操作?好吧,我们必须明白,没有魔力。如果它是SQL,那么SQL只有一种方法可以使用适当的SQL语句来INSERTING,UPDATING和DELETING记录。使用Delphi-SQL Server似乎有一个我们从未注意过的隐式SQL语句。但是对于Oracle,我们必须为每个操作提供自己的语句。  如果您使用UniDac或ODAC,那么StoredProc对象中有SQLInsert,SQLUpdate,SQLDelete属性。如果您想通过DBGrid插入记录,那么您应该将其SQLInsert属性编辑为

INSERT INTO EMPLOYEES VALUES(:EMPLOYEEID,:EMPLOYEENAME)

其中变量如下:对应于存储过程的te字段。它们只是绑定变量。当更新和删除时,您需要一些唯一值来表示特定记录。主键是一个选项(可能是唯一的选项,因为我无法弄清楚如何将ROWID用于同一目的)。所以UPDATE和DELETE的sql语句将是

DELETE FROM EMPLOYEES WHERE EMPLOYEEID=:EMPLOYEEID

UPDATE EMPLOYEES SET EMPLOYEENAME=:EMPLOYEENAME WHERE EMPLOYEEID=:EMPLOYEEID

P.S。我刚刚找到了一种方法来使用ROWID来更新和删除语句。在您的存储过程中,如果您也选择ROWID并为其指定别名,那么您可以构建UPDATE和DELETE语句,如下所示:

UPDATE EMPLOYEES SET EMPLOYEENAME=:EMPLOYEENAME,..... WHERE ROWID=:RECORD_ROWID
DELETE FROM EMPLOYEES WHERE ROWID=:RECORD_ROWID

在前面的语句中,RECORD_ROWID是由于别名ROWID而从存储过程返回的字段名。如果你使用:ROWID而不是你将得到“ORA-01745:无效的主机/绑定变量名称”错误。这是因为在绑定变量中,冒号后面不能跟保留字。而ROWID是一个保留字。