2011-12-20 96 views
2

我們有一個用Delphi 2010編寫的連接到SQL Server數據庫的應用程序。現在我們正在向Oracle遷移。使用SQL Server,很容易從連接到存儲過程的dbgrid執行插入,更新和刪除操作。使用存儲過程組件時插入,刪除和更新

這是因爲SQL Server中的存儲過程可以輕鬆地充當一個表,以便您可以對其執行任何操作,只要它在結果集內返回必要的列即可。現在用Oracle,我不知道該怎麼做。我將一個DBGrid連接到一個DataSource,其數據集是一個Stored Procedure對象,但我無法編輯該網格。只是選擇是可能的。

我需要做些什麼來實現這個目標?我使用UniDac組件套件連接到Oracle數據庫。

+0

我還沒有使用過uniDac組件,但是他們的網絡指出TUniStoredProc「允許你編輯作爲參數返回的遊標數據」。您使用了哪些特定組件?以及如何使用? – 2011-12-20 11:36:13

+0

我使用TUniStoredProcedure – 2011-12-20 12:30:04

回答

3

好的,在這裏我正在回答這個問題,儘管我可以看到很少有人在最近與德爾福打交道。比方說,我們在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; 

現在,在德爾福你選擇一個存儲過程組件(可能是從ODAC或UniDac組件套件).SET其StoredProcName GET_EMPLOYEES。然後,您可以添加過程在遊標中返回的所有字段。如果運行應用程序並激活存儲過程,您將能夠看到所有記錄。但是,如果您嘗試插入,修改或刪除任何內容,您將無法做到這一點。現在,有一件非常棘手的事情。如果您選中,您會看到所有字段的ReadOnly屬性都設置爲True。即使將它們設置爲False,實際數據庫中也不會有任何變化,但您可以編輯DBGrid。

所以,我們已經到了主要部分。舊的Delphi-SQL Server合作伙伴關係如何工作,以便您可以從DBGrid進行任何操作?那麼,我們必須明白,沒有魔法。如果它是SQL,那麼SQL只有一種插入,更新和刪除記錄的方法 - 這是使用適當的SQL語句。使用Delphi-SQL Server,似乎有一個我們從未關注的隱式SQL語句。但對於Oracle,我們必須爲每項操作提供自己的聲明。 如果使用UniDac或ODAC然後還有的SQLInsert,SQLUPDATE,在StoredProc object.If SQLDELETE性能要通過插入DBGrid的一個記錄,那麼你應該修改它的SQLInsert屬性

INSERT INTO EMPLOYEES VALUES(:EMPLOYEEID,:EMPLOYEENAME) 

其中變量如下:是對應於存儲過程的te字段。他們只是簡單地綁定變量。更新和刪除時,儘管您需要一些唯一值來表示特定的記錄。主鍵是一個選項(也許是唯一的選擇,因爲我還沒有弄清楚如何將ROWID用於相同的目的)。因此,對於更新SQL語句和DELETE將

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:無效的主機/綁定變量名稱」錯誤。這是因爲在一個綁定變量中,冒號不能跟一個保留字。 ROWID是一個保留字。

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組件。
+0

+1,但關於第三條評論有時你沒有單獨的組件,而是有一些屬性,如InsertSQL,UpdateSQL和DeleteSQL。 – 2011-12-21 16:19:47

相關問題