2013-08-17 81 views
0

我正在編寫一個存儲過程以從表add_files_tables中檢索匹配的文件位置。我用ref cursor的case語句來獲取結果集,然後打印文件名。我創建了這些軟件包,但它總是給我空集。哪裏有問題 。case statement not ref with ref cursor

create or replace package search_cur as 
    type my_cursor is ref cursor; 
    function search_File(FILE_NAME varchar2,opt number) return my_cursor; 
end search_cur; 
/

create or replace package body search_cur as 
    function search_File(FILE_NAME varchar2,opt number) return my_cursor is 
     ret my_cursor; 
    begin 
     Case opt 
      when 1 THEN 
       OPEN ret FOR 
        select file_location 
         from add_files_details 
        where upper(username) like '%'||file_Name||'%' 
       ; 
       return ret; 
      when 2 THEN 
       OPEN ret FOR 
        select file_location 
         from add_files_details 
        where upper(EXTENSION) like '%'||file_name||'%' 
       ; 
       return ret; 
      WHEN 3 THEN 
       OPEN ret FOR 
        select file_location 
         from add_files_details 
        where upper(UPLOAD_DATE) like '%'||file_name||'%' 
       ; 
       return ret; 
      WHEN 4 THEN 
       OPEN ret FOR 
        select file_location 
         from add_files_details 
        where upper(FOLDER_ID) like '%'||file_name||'%'; 
       return ret; 
      when 5 then 
       open ret for 
        select file_location 
         from add_files_details 
        where upper(file_name) like '%'||file_name||'%'; 
       return ret; 
     end case; 
    end search_file; 
end search_cur; 
/
+0

請發佈一個[簡短,自包含的示例](http://sscce.org/),它可以重現您的問題。你已經發布了太多的*代碼和太多的*小的*:太多*太多了,因爲我無法想象你的問題要求所有這些情況都是可重複的,而且*小*,因爲你沒有'張貼什麼將允許它被複制。 – ruakh

+0

由於您將所有字段轉換爲大寫字母作爲比較的一部分,所以您可能需要更改比較以在使用前將輸入參數FILE_NAME轉換爲大寫。使用'...'這樣的東西(file_name就像是'%'|| UPPER(file_name)||'%''。)分享和欣賞 –

+0

發佈時,我很着急,這就是爲什麼我只發佈代碼。我試圖通過它來實現高級搜索功能,當任何用戶選擇哪種類型時,他希望通過擴展名或用戶名進行搜索,這些搜索將作爲數字進行檢索,然後在搜索框中輸入他的名字。 ,我們考慮創建一個單獨的過程,併爲不同的選項提供不同的輸出。 @Bob,實際上我是在java前端中轉換search_value。 – DeSmOnd

回答

1

更改參數的名稱,使其與字段名稱不衝突。表格中有一個名爲file_name的字段,該例程的參數爲FILE_NAME。這些在PL/SQL編譯器的眼中是相同的,並且可能會猜測應該使用哪一個。嘗試是這樣的:

create or replace package body search_cur as 
    function search_File(inp_Search_value varchar2, 
         inp_Opt   number) return my_cursor is 
     ret my_cursor; 
    begin 
     Case inp_Opt 
      when 1 THEN 
       OPEN ret FOR 
        select file_location 
         from add_files_details 
        where upper(username) like '%'||UPPER(inp_Search_value) ||'%' 
       ; 
       return ret; 
      when 2 THEN 
       OPEN ret FOR 
        select file_location 
         from add_files_details 
        where upper(EXTENSION) like '%'||UPPER(inp_Search_value)||'%' 
       ; 
       return ret; 
      WHEN 3 THEN 
       OPEN ret FOR 
        select file_location 
         from add_files_details 
        where upper(UPLOAD_DATE) like '%'||UPPER(inp_Search_value)||'%' 
       ; 
       return ret; 
      WHEN 4 THEN 
       OPEN ret FOR 
        select file_location 
         from add_files_details 
        where upper(FOLDER_ID) like '%'||UPPER(inp_Search_value)||'%'; 
       return ret; 
      when 5 then 
       open ret for 
        select file_location 
         from add_files_details 
        where upper(file_name) like '%'||UPPER(inp_Search_value)||'%'; 
       return ret; 
     end case; 
    end search_file; 
end search_cur; 

由於輸入字段不總是它的誤導稱之爲一​​個文件名 - 我建議使用一個通用樣的名字,如上圖所示。另外,如果要將數據庫字段轉換爲大寫,那麼轉換搜索參數也是一個好主意。

分享和享受。

+0

這個相互衝突的名字導致了這個問題。我的愚蠢錯誤。謝謝你指出解決方案。 – DeSmOnd