我们有一个用Delphi 2010编写的应用程序,它连接到SQL Server数据库。现在我们正在迁移到Oracle。使用SQL Server,可以非常轻松地从连接到存储过程的dbgrid执行插入,更新,删除。
这是因为SQL Server中的存储过程可以很容易地充当表,以便您可以对其执行任何操作,前提是它返回结果集中的必要列。现在使用Oracle我不知道该怎么做。我将DBGrid连接到DataSource,其数据集是Stored Procedure对象,但我无法编辑网格。可以选择Just。
我需要做些什么才能实现这一目标?我使用UniDac组件套件连接到Oracle数据库。
答案 0 :(得分:3)
INSERT INTO <name>
,UPDATE <name>
或DELETE FROM <name>
中。答案 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是一个保留字。