2011-07-17 72 views
2

我目前主要使用SQL Server,現在我正在向Oracle遷移新項目。包是從Oracle數據庫返回數據的唯一方法嗎?

我正在嘗試創建一個將數據返回到.net應用程序的proc。我得到這個工作的唯一方法是通過使用包這樣的:

CREATE OR REPLACE PACKAGE GetAllDepartments AS 
TYPE T_CURSOR IS REF CURSOR; 
PROCEDURE p_GetAllDepartments 
(
    cur_Result OUT T_CURSOR 
); 
END GetAllDepartments; 

CREATE OR REPLACE PACKAGE BODY GetAllDepartments AS 
PROCEDURE p_GetAllDepartments 
(
    cur_Result OUT T_CURSOR 
) 
IS 
BEGIN 
    OPEN cur_Result FOR 
    SELECT * FROM DEPARTMENTS; 

END p_GetAllDepartments; 
END GetAllDepartments; 

這是去與甲骨文的唯一途徑?我就不能創建proc和直接調用呢?謝謝

+0

絕對有可能只有一個沒有包的存儲過程,並從.net應用程序調用它。當你嘗試執行這樣一個程序或者只是沒有返回結果時,你會得到一個執行嗎? – alwayslearning

回答

4

假設你有甲骨文支持的版本,你應該能夠做到像

CREATE OR REPLACE PROCEDURE get_all_departments(p_result OUT SYS_REFCURSOR) 
AS 
BEGIN 
    OPEN p_result 
    FOR SELECT * 
     FROM departments; 
END get_all_departments; 

這就是說,你通常使用的軟件包來收集做相關的事情的程序組織的角度更好。例如,就你而言,通常情況下有一個包含處理部門的所有程序的包(即create_department,delete_department等)。

從一般的文體角度來看,在Oracle中創建一個視圖來實現存儲過程中放置​​的任何邏輯並查詢該視圖而不是創建僅執行查詢的存儲過程。

+0

它的工作原理是,SYS_REFCURSOR數據類型是我所缺少的,你知道爲什麼REFCURSOR在這種情況下不起作用嗎?..似乎我可以在調用這個過程時使用refcursor參數,很奇怪.. – Pablote

+0

@Pablote - 你是什麼意思是「REFCURSOR不起作用」?您當然可以創建一個定義弱類型REF CURSOR的包,然後創建一個將弱類型REF CURSOR用作輸出參數的獨立過程。您不能在過程中定義自己的弱類型REF CURSOR,然後將其用作OUT參數,因爲弱類型遊標的聲明將在OUT參數的聲明之前,並且不會在範圍之外可見程序。該包的使用只是允許您在過程之前聲明遊標。 –

+0

我可以在你的迴應中用下面的代碼調用proc:[變量mycur REFCURSOR; exec get_all_departments(:mycur);打印mycur;] ...但我不能在proc聲明中使用同一個REFCURSOR,我只是發現了關於SYS_REFCURSOR的感謝。您對類型聲明的評價是我最初懷疑需要使用OUT光標參數,謝謝 – Pablote

1

你可以做到這一點,沒有一個包,例如,通過創建一個返回結果集的函數。

這些功能可被使用如表,例如:SELECT * FROM my_function()

因爲結果沒有被緩衝在服務器上,但由行發送行到客戶端這與流水線功能特別有效:

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_packages.htm#i1008519

但基本技術仍然是相同的,即你必須定義一個用於函數返回類型的類型。您不能讓它像PostgreSQL或SQL Server一樣返回「匿名」結果集。

相關問題