2015-09-04 92 views
0

我試圖從SQL Server移至Oracle數據庫。我必須將存儲過程從SQL Server移動到Oracle,並使用INNER JOIN從多個表執行查詢。我想在這裏澄清一些事情。將SQL Server存儲過程轉換爲Oracle過程以從表中查詢

SQL Server存儲過程:

[dbo].[QueryAll] 
    @score1_min int = 0, 
    @score1_max int = 999, 
    @type1 varchar (1) = '%', 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT * 
    FROM FUNIJ1 uni 
    INNER JOIN CAPI99 api99 on api99.application_id = uni.application_id 
    INNER JOIN CAPI41 api41 on api41.application_id = uni.application_id 
    INNER JOIN CAPI10 api10 on api10.application_id = uni.application_id 
    WHERE 
     api10.score1 BETWEEN @score1_min AND @score1_max 
     AND uni.type1 LIKE @type1 
END 

我的Oracle過程

create or replace PROCEDURE QUERYALL 
(
    SCORE1_MIN IN NUMBER DEFAULT 0 
, SCORE1_MAX IN NUMBER DEFAULT 999 
, TYPE IN VARCHAR2 
) 
AS 
BEGIN 
    SELECT * 
    FROM FUNIJ1 uni 
    INNER JOIN CAPI99 on CAPI99.APPLICATION_ID = uni.APPLICATION_ID 
    INNER JOIN CAPI41 on CAPI41.APPLICATION_ID = uni.APPLICATION_ID 
    INNER JOIN CAPI10 on CAPI10.APPLICATION_ID = uni.APPLICATION_ID 
    WHERE 
     CAPI10.score1 BETWEEN score1_min AND score1_max 
     AND uni.type LIKE type 
END REPOQUERYALL ; 
  1. 我曾經%作爲默認的查詢參數在沒有輸入的情況下返回在SQL Server 所有值來自用戶。我不確定我必須在Oracle中使用什麼作爲默認值才能返回所有內容。

  2. 列表項目Oracle正在使用新術語INTO關注SELECT *。我不確定是否需要在這種情況下使用INTO或光標。我不知道這裏適合哪種方式以及如何使用它。

  3. 我很感激,如果有人可以將此SQL Server轉移到Oracle過程。我不確定我的Oracle是否100%正確。

回答

0

下面是使用Sys_Cursor工作的代碼。感謝@TS幫助引導我回答這個問題。

create or replace PROCEDURE QUERYALL 
(
o_Cursor OUT SYS_REFCURSOR 
) 
AS 
BEGIN 
O_Cursor := NULL; 

OPEN O_Cursor FOR 
    SELECT * FROM FUNIJ1 
    INNER JOIN CAPI99 on CAPI99.APPLICATION_ID = FUNIJ1 .APPLICATION_ID 
    INNER JOIN CAPI41 on CAPI41.APPLICATION_ID = FUNIJ1 .APPLICATION_ID 
    INNER JOIN CAPI10 on CAPI10.APPLICATION_ID = FUNIJ1 .APPLICATION_ID 
    WHERE 
    ---- 
    ---- 
END QUERYALL; 

當您在Java中使用此過程來顯示錶時,您需要將Sys_Cursor調用到Resultset中。

String sp= "{CALL QUERYALL(?)}"; // Procedure calling with Sys_Cursor 
cst = con.prepareCall(sql); 
cst.registerOutParameter(1, OracleTypes.CURSOR); 
cst.executeUpdate(); 
rs = (ResultSet) cst.getObject(1);    
while(rs.next()) { 
---- 
---- 
} 
2

以下是你需要了解Oracle存儲過程是什麼 - 不像在SQL Server中,你不能只是做SELECT ...任何編程塊,除非這是子查詢或select... into...

如果目標是從過程返回記錄集,則在Oracle中,必須添加Sys_RefCursor輸出參數,並使用select語句打開此參考光標。

你不是很遠 - check this example。並且記住,當你做Open <cursor_name> FOR ...時,FOR後面的內容可以是動態SQL字符串或只是編譯SQL。

+0

謝謝T.S.因此,當我添加'RefCursor'時,那些Oracle示例也會提及IN參數。這是強制性的嗎? – SamK

+0

是的。如果你想從Oracle存儲過程返回數據,你需要聲明'Sys_refcursor'類型的'output'參數來返回這個數據。另一種(類似的)做法是通過聲明函數'create或replace Function ... return sys_refcursor'。但它是真的一樣的東西。 'Return'只是一種輸出參數。所以,如果你使用存儲過程,你可以返回多個ref遊標。在sql server中,你可以簡單地寫'select * from t1;從t2選擇* - 你有2個結果集。在oracle中,對於每個'select'來返回數據,你需要'sys_refcursor'參數:'Open p1 ..; Open p2' –

+0

'IN'參數只有當你需要它們傳遞一些東西給SP時。參考光標必須'OUT' –

相關問題