2017-02-10 67 views
0

我創建了一個存儲過程,用戶可以在參數如何忽略空參數在存儲過程中的Oracle

create or replace procedure MyProcerdure 
(
title Film.Title%Type, 
country Film.country%Type, 
language Film.language%Type, 
category Film.category%Type, 
refCursor OUT SYS_REFCURSOR) 
AS 
begin 
OPEN refCursor FOR 
select Film.Title as FilmTitle, 
     Film.language as language 
     Film.category 

FROM Film 
Where Film.language=language 
AND Film.category=category 
AND Film.Country=country 
//etc... 

插頁1個或多個值,但我想允許用戶沒有按」事實不必填寫所有內容並將它們傳遞給參數,這意味着如果用戶只輸入語言而沒有其他任何內容,則返回適當的語言,並假設他輸入了國家和語言,因此結果應該爲WHERE語言和國家/地區等於他插入了什麼

是否有可能在使用oracle的存儲過程中創建這樣的機制?

謝謝

回答

2

您只需在查詢中添加一些邏輯來處理的事實,參數可以爲空:

CREATE OR REPLACE PROCEDURE MyProcerdure(
             p_title    Film.Title%TYPE, 
             p_country   Film.country%TYPE, 
             p_language   Film.language%TYPE, 
             p_category   Film.category%TYPE, 
             po_refCursor OUT SYS_REFCURSOR 
             ) AS 
BEGIN 
    OPEN po_refCursor FOR 
     SELECT Film.Title AS FilmTitle, Film.language AS language, Film.category 
     FROM Film 
     Where (p_title is null or Film.title = p_title ) 
      AND (p_country is null or Film.country = p_country) 
      AND (p_language is null or Film.language = p_language) 
      AND (p_category is null or Film.category = p_category); 
END; 
1

來完成,這是使用動態SQL的最佳方式。您可以有條件地連接正確的過濾器。您還需要連接替代版本,以便未提供值時。

例如,以下內容允許您篩選或放入編譯器將忽略的語句,但在動態SQL中仍具有正確數量的綁定變量。

CREATE OR REPLACE PROCEDURE MyProcerdure 
(
    title  file.title%TYPE, 
    country file.country%TYPE, 
    language file.language%TYPE, 
    category file.category%TYPE, 
    refCursor OUT SYS_REFCURSOR 
) IS 
    l_stmt VARCHAR2(4000); 
BEGIN 
    l_stmt := 'SELECT f.title AS filetitle,'|| 
      '  f.language AS language,'|| 
      '  f.category'|| 
      ' FROM file f'|| 
      ' WHERE 1 = 1'; 

    IF title IS NOT NULL THEN 
     l_stmt := l_stmt || ' AND f.title = :title'; 
    ELSE 
     l_stmt := l_stmt || ' AND (1=1 OR :title IS NULL)'; 
    END IF; 

    -- The others would be done similarly 

    OPEN refCursor FOR l_stmt USING title, -- The others would go the same order as above 
END; 
/
+1

如果你要使用這個動態sql,有一個在加入無點在'ELSE'子句中提到的謂詞。 – Boneist

+1

我相信只有在沒有其他工作的情況下才能使用動態SQL。在這種情況下,我認爲使用一些布爾邏輯的解決方案會更容易和更安全。 – Aleksej

+1

@Boneist我有點遲到這個位實際上沒有'else'代碼會導致異常'ORA-01006:綁定變量不存在' –

相關問題