Stored procedures case语句不使用ref游标

Stored procedures case语句不使用ref游标,stored-procedures,plsql,case,Stored Procedures,Plsql,Case,我正在编写一个存储过程,从表add\u files\u tables中检索匹配的文件位置。我使用带有ref游标的case语句来获取resultset,然后将打印文件名。我已经创建了包,但它总是给我空集。问题在哪里 create or replace package search_cur as type my_cursor is ref cursor; function search_File(FILE_NAME varchar2,opt number) return my_cur

我正在编写一个存储过程,从表add\u files\u tables中检索匹配的文件位置。我使用带有ref游标的case语句来获取resultset,然后将打印文件名。我已经创建了包,但它总是给我空集。问题在哪里

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;
/

更改参数的名称,使其与字段名不冲突。表中有一个名为
file\u name
的字段,例程的参数是
file\u 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;
由于输入字段并不总是文件名,因此将其称为文件名会产生误导-我建议使用如上所示的通用名称。此外,如果要将数据库字段转换为大写,最好也转换搜索参数


分享和享受。

请发布一篇文章,再现您的问题。您发布了太多的代码和太少的代码:太多了,我无法想象您的问题要求所有这些案例都是可复制的,而太少了,在这种情况下,您尚未发布允许复制的内容。您可能希望在使用输入参数文件之前更改比较,将其转换为大写,因为您正在将所有字段转换为大写,作为比较的一部分,例如,使用
…where upper(文件名,如“%”| | upper(文件名))之类的内容| |“%”
。分享和享受。在发布时,我很匆忙,这就是为什么我只发布了代码。我试图通过它实现高级搜索功能。每当任何用户选择哪种类型时,他都想搜索,比如通过扩展名或用户名,这将被检索为一个数字,然后在搜索框中输入名称。因此,我们认为创建单个过程并为不同选项提供不同输出的想法。@Bob,实际上我是在java frontend中转换搜索值的。这个冲突的名称导致了这个问题。我犯了一个愚蠢的错误。谢谢你指出解决方案。