我試圖從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 ;
我曾經%作爲默認的查詢參數在沒有輸入的情況下返回在SQL Server 所有值來自用戶。我不確定我必須在Oracle中使用什麼作爲默認值才能返回所有內容。
列表項目Oracle正在使用新術語INTO關注
SELECT *
。我不確定是否需要在這種情況下使用INTO或光標。我不知道這裏適合哪種方式以及如何使用它。我很感激,如果有人可以將此SQL Server轉移到Oracle過程。我不確定我的Oracle是否100%正確。
謝謝T.S.因此,當我添加'RefCursor'時,那些Oracle示例也會提及IN參數。這是強制性的嗎? – SamK
是的。如果你想從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' –
'IN'參數只有當你需要它們傳遞一些東西給SP時。參考光標必須'OUT' –