2014-12-19 117 views
0

我正在使用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中很好地工作。有什麼建議麼?還是有什麼我誤解?

+2

與SQL Server不同,您不能只在存儲過程中放入'SELECT'來將數據返回給客戶端。在12.1中有一些額外的語法來支持這種未聲明的'OUT sys_refcursor',但是因爲你已經爲11g標記了這個,所以這不適合你。在11g中,從存儲過程返回數據的唯一方法是使用'OUT'參數。 –

+0

@JustinCave:我很害怕這個。非常有趣,發現我們需要做的事情受到客戶需要的軟件版本的阻礙...感謝您的幫助。 –

回答

0

正如Justin Cave在上面評論中所提到的,「你不能僅僅在存儲過程中使用SELECT來將數據返回給客戶端。」至少與Oracle 11g不同。他繼續說道:「在11g中,從存儲過程中重新生成數據的唯一方法是使用OUT參數」,AFIK不能使用pyodbc的3.0.7版本。