【问题标题】:Insert, delete ,update when using Stored Procedure component使用存储过程组件时的插入、删除、更新
【发布时间】:2011-12-20 06:39:59
【问题描述】:

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

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

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

【问题讨论】:

  • 我没有使用过 uniDac 组件,但他们的网站声明 TUniStoredProc“让您编辑作为参数返回的光标数据”。您正在使用什么特定组件以及如何使用?

标签: oracle delphi stored-procedures


【解决方案1】:
  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 条评论,有时您没有单独的组件,而是有一些属性,如 InsertSQL、UpdateSQL 和 DeleteSQL。
【解决方案2】:

好的,我在这里回答这个问题,尽管我可以看到最近很少有人在处理 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 是保留字。

【讨论】:

    猜你喜欢
    • 2014-06-23
    • 2013-11-07
    • 2013-12-19
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2019-04-09
    • 2017-12-02
    • 1970-01-01
    相关资源
    最近更新 更多