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

Oracle 使用存储过程组件时插入、删除、更新,oracle,delphi,stored-procedures,Oracle,Delphi,Stored Procedures,我们有一个用Delphi2010编写的应用程序,它连接到SQLServer数据库。现在我们正在迁移到Oracle。使用SQLServer,可以很容易地从连接到存储过程的dbgrid中执行插入、更新和删除操作 这是因为SQL Server中的存储过程可以很容易地充当表,这样您就可以对其执行任何操作,只要它返回resultset中所需的列。现在对于甲骨文,我不知道该怎么做。我将DBGrid连接到数据源,数据源的dataset是存储过程对象,但我无法编辑网格。只需选择即可 要实现这一点,我需要做什么?

我们有一个用Delphi2010编写的应用程序,它连接到SQLServer数据库。现在我们正在迁移到Oracle。使用SQLServer,可以很容易地从连接到存储过程的dbgrid中执行插入、更新和删除操作

这是因为SQL Server中的存储过程可以很容易地充当表,这样您就可以对其执行任何操作,只要它返回resultset中所需的列。现在对于甲骨文,我不知道该怎么做。我将DBGrid连接到数据源,数据源的dataset是存储过程对象,但我无法编辑网格。只需选择即可

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

  • Oracle不支持此类功能。在Oracle中,您不能编辑存储过程提供的结果集,也不能将存储过程包含到
    插入到
    更新
    删除中
  • 虽然SQL Server开发人员“始终”使用存储过程是一种传统做法(由于许多原因),但Oracle开发人员并非如此。但甲骨文也有可能。搜索“”以查看如何使用SP获取数据。并使用普通或打包(首选)SP向数据库发布更新。这些过程将通过参数接收旧/新字段值
  • 我可以说,我不能确切地说关于UniDAC。但我希望UniDAC具有类似的功能。要使用SP发布更新,您需要使用组件
    好的,我在这里回答这个问题,虽然我可以看到最近很少有人与德尔福打交道。假设我们在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组件套件)。然后,您可以在游标中添加该过程返回的所有字段。如果运行应用程序并激活存储过程,您将能够看到所有记录。但如果你试图插入、修改或删除任何东西,你都会失败。现在,有一件非常棘手的事情。如果选中,您将看到所有字段的ReadOnly属性都设置为True。即使将它们设置为False,真实数据库中也不会有任何更改,尽管您可以编辑DBGrid

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

    INSERT INTO EMPLOYEES VALUES(:EMPLOYEEID,:EMPLOYEENAME)
    
    其中:后面的变量对应于存储过程的te字段。它们只是绑定变量。在更新和删除时,您需要一些唯一的值来表示特定的记录。主键是一个选项(可能是唯一的选项,因为我还没有弄清楚如何将ROWID用于相同的目的)

    DELETE FROM EMPLOYEES 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:无效主机/绑定变量名”错误。这是因为在绑定变量中,冒号后面不能跟保留字。ROWID是一个保留字。

    我没有使用uniDac组件,但它们的web声明TUniStoredProc“允许您编辑作为参数返回的游标数据”。您正在使用什么特定组件以及如何使用?+1,但关于第三条注释,有时您没有单独的组件,而是具有一些属性,如InsertSQL、UpdateSQL和DeleteSQL。
    UPDATE EMPLOYEES SET EMPLOYEENAME=:EMPLOYEENAME,..... WHERE ROWID=:RECORD_ROWID
    DELETE FROM EMPLOYEES WHERE ROWID=:RECORD_ROWID