我正在使用pyodbc(版本3.0.7)來訪問Oracle(版本11g)數據庫。我們正在編寫存儲過程來處理插入。插入對象的主鍵分配有觸發器,所以我們希望在python腳本調用存儲過程之後,將新插入的對象的主鍵放到python中。 (由於客戶要求,我們沒有更改數據庫,庫等的靈活性)通過pyodbc從Oracle存儲過程插入獲取結果
根據pyodbc文檔,不支持存儲過程中的返回(OUT)參數。既沒有存儲功能。文檔建議將SELECT語句添加到存儲過程的末尾以獲取結果。但是,我們對SQL腳本不熟悉,Google搜索過去兩天已經爲SQLServer和其他數據庫提供了大量信息,但Oracle幾乎沒有。在Oracle數據庫中嘗試使用SQLServer示例並沒有太大的幫助,因爲Oracle SQL Developer在語法中顯示了各種錯誤(DECLARE不應該是INL語句,INTO語句必須使用INTO等)。
最終,我們希望存儲過程插入一個新對象,然後我們想以某種方式獲取該對象的新創建的主鍵。
下面是正確地插入一個對象(注意,如果obj_id被給定爲在python「無」,則該對象被觸發分配一個新的主密鑰)的存儲過程的一個例子:
CREATE OR REPLACE PROCEDURE insert_an_obj (an_obj_id NUMBER) AS
new_primary_key NUMBER;
BEGIN
INSERT INTO OBJS (OBJ_ID) VALUES (an_obj_id) RETURNING OBJ_ID INTO new_primary_key;
-- A SELECT statement should go here in order to get the new value for new_primary_key.
END insert_an_obj;
假設存儲過程結束時的SELECT語句會在下一次我的腳本調用cursor.fetchall()
時使腳本獲得所選內容的列表。但是,我一直無法得到這個工作。一些失敗的SELECT實例(其中一個可能會去在存儲過程中上述代替SELECT評論)包括以下內容:
-- These fail to compile because SQL Developer doesn't like them (though various sources online said that they work on SQLServer):
SELECT * FROM OBJS WHERE OBJ_ID=new_primary_key;
SELECT OBJ_ID FROM OBJS WHERE OBJ_ID=new_primary_key;
就像我說的,我是新來的SQL,並有可能我只需要知道正確的語法來讓SELECT語句在Oracle中很好地工作。有什麼建議麼?還是有什麼我誤解?
與SQL Server不同,您不能只在存儲過程中放入'SELECT'來將數據返回給客戶端。在12.1中有一些額外的語法來支持這種未聲明的'OUT sys_refcursor',但是因爲你已經爲11g標記了這個,所以這不適合你。在11g中,從存儲過程返回數據的唯一方法是使用'OUT'參數。 –
@JustinCave:我很害怕這個。非常有趣,發現我們需要做的事情受到客戶需要的軟件版本的阻礙...感謝您的幫助。 –