好的,我在这里回答这个问题,尽管我可以看到最近很少有人在处理 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 只有一种方式 INSERTING、UPDATING 和 DELETING 记录——它是使用适当的 SQL 语句。在 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
附:我刚刚找到了一种将 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: invalid host/bind variable name”错误。这是因为在绑定变量中,冒号后面不能跟保留字。 ROWID 是保留字。