【问题标题】:How to use LOWER/UPPER in Oracle SQL Developer Package如何在 Oracle SQL Developer 包中使用 LOWER/UPPER
【发布时间】:2014-12-11 10:51:45
【问题描述】:

我在 Oracle SQL Developer 中为我在 VIsual Studio 2013 中创建的站点创建了一个 SQL 包。该包基本上从搜索框中获取输入,并根据搜索从数据库表中找到所有详细信息,然后返回它回到表格内的网站。

我知道这听起来可能很简单,但我有点卡住了,但我想做的是让用户使用大写或小写字母进行搜索,以确保返回数据,因为在我搜索时它已经以匹配数据在表中的精确存储方式,这对用户不友好。

请有人帮我解决我要更改的包/SQL 中的哪个位置,以便用户可以使用大写或小写字母。

我的包裹代码;

create or replace
PACKAGE BODY USER_PRO AS


procedure emp_pro_search
(
  get_emp_details OUT SYS_REFCURSOR,
    p_login_search IN varchar2,
    p_firstname_search IN varchar2,
    p_surname_search IN varchar2,
    p_empnumb_search IN varchar2,
    p_prolist_search IN varchar2
)
IS
l_login_clause VARCHAR2(255);
l_firstname_clause VARCHAR2(255);
l_surname_clause VARCHAR2(255);
l_empnumb_clause VARCHAR2(255);
l_prolist_clause VARCHAR2(255);
BEGIN

IF p_login_search IS NOT NULL THEN
  l_login_clause := ' AND LOGIN =''' || p_login_search ||'''';
END IF;

IF p_firstname_search IS NOT NULL THEN
l_firstname_clause := ' AND FIRSTNAME =''' || p_firstname_search ||'''';
END IF;

IF p_surname_search IS NOT NULL THEN
l_surname_clause := ' AND SURNAME =''' || p_surname_search ||'''';
END IF;

IF p_empnumb_search IS NOT NULL THEN
l_empnumb_clause := ' AND EMP_NUMB =''' || p_empnumb_search ||'''';
END IF;

IF p_prolist_search IS NOT NULL THEN
l_prolist_clause := ' AND PRO_LIST =''' || p_prolist_search ||'''';
END IF;

OPEN get_user_details FOR
 'SELECT login, emp_id, surname, forename, middlename, date_of_birth, emp_numb, position, ' || 
      'FROM  my_employment_table ' ||
      ' WHERE 1 = 1 ' ||
     l_login_clause ||
     l_firstname_clause ||
     l_surname_clause ||
     l_empnumb_clause ||
     l_prolist_clause ||
     'ORDER BY surname ';

END emp_pro_search;

这是我调用包的类;

 Public Shared Function SearchResults(ByVal sLogin As String, ByVal sfirstName As String, ByVal slastName As String, ByVal sempNumber As String, ByVal sproList As String) As DataSet

    Dim oraConnect As New OracleConnection
    oraConnect.ConnectionString = ConfigurationManager.ConnectionStrings("mydatabase").ConnectionString

    Dim p_login_search As New OracleParameter
    p_login_search.Direction = ParameterDirection.Input
    p_login_search.OracleDbType = OracleDbType.Varchar2
    p_login_search.Value = sLoginid

    Dim p_firstname_search As New OracleParameter
    p_firstname_search.Direction = ParameterDirection.Input
    p_firstname_search.OracleDbType = OracleDbType.Varchar2
    p_firstname_search.Value = sfirstName

    Dim p_surname_search As New OracleParameter
    p_surname_search.Direction = ParameterDirection.Input
    p_surname_search.OracleDbType = OracleDbType.Varchar2
    p_surname_search.Value = slastName

    Dim p_empnumb_search As New OracleParameter
    p_empnumb_search.Direction = ParameterDirection.Input
    p_empnumb_search.OracleDbType = OracleDbType.Varchar2
    p_empnumb_search.Value = sEsrnumber

    Dim p_prolist_search As New OracleParameter
    p_prolist_search.Direction = ParameterDirection.Input
    p_prolist_search.OracleDbType = OracleDbType.Varchar2
    p_prolist_search.Value = sProfnumber

    Dim oraCommand As New OracleCommand
    oraCommand.Connection = oraConnect
    oraCommand.CommandType = Data.CommandType.StoredProcedure
    oraCommand.CommandText = "USER_PRO.EMP_PRO_SEARCH"


    oraCommand.Parameters.Add(New OracleParameter("p_RefCursor", OracleDbType.RefCursor, 0, ParameterDirection.Output, False, CType(0, Byte), CType(0, Byte), "", DataRowVersion.Current, Nothing))
    oraCommand.Parameters.Add(p_login_search)
    oraCommand.Parameters.Add(p_firstname_search)
    oraCommand.Parameters.Add(p_surname_search)
    oraCommand.Parameters.Add(p_empnumb_search)
    oraCommand.Parameters.Add(p_prolist_search)

    Dim da As New OracleDataAdapter(oraCommand)
    Dim ds As New DataSet
    da.Fill(ds)

    Return ds
End Function

【问题讨论】:

    标签: sql vb.net plsql


    【解决方案1】:

    由于 SQL 中引号内的所有内容都区分大小写,因此要执行不区分大小写的搜索,方法是强制搜索条件和数据为大写/小写:

    create or replace
    PACKAGE BODY USER_PRO AS
    
    
    procedure emp_pro_search
    (
      get_emp_details OUT SYS_REFCURSOR,
        p_login_search IN varchar2,
        p_firstname_search IN varchar2,
        p_surname_search IN varchar2,
        p_empnumb_search IN varchar2,
        p_prolist_search IN varchar2
    )
    IS
    l_login_clause VARCHAR2(255);
    l_firstname_clause VARCHAR2(255);
    l_surname_clause VARCHAR2(255);
    l_empnumb_clause VARCHAR2(255);
    l_prolist_clause VARCHAR2(255);
    BEGIN
    
    IF p_login_search IS NOT NULL THEN
      l_login_clause := ' AND UPPER(LOGIN) =''' || UPPER(p_login_search) ||'''';
    END IF;
    
    IF p_firstname_search IS NOT NULL THEN
    l_firstname_clause := ' AND UPPER(FIRSTNAME) =''' || UPPER(p_firstname_search) ||'''';
    END IF;
    
    IF p_surname_search IS NOT NULL THEN
    l_surname_clause := ' AND UPPER(SURNAME) =''' || UPPER(p_surname_search) ||'''';
    END IF;
    
    IF p_empnumb_search IS NOT NULL THEN
    l_empnumb_clause := ' AND EMP_NUMB =''' || p_empnumb_search ||'''';
    END IF;
    
    IF p_prolist_search IS NOT NULL THEN
    l_prolist_clause := ' AND PRO_LIST =''' || p_prolist_search ||'''';
    END IF;
    

    我没有为“Prolist”添加上面的子句 - 如果这是一个 varchar 字段,您可以像我为名字/姓氏所做的那样更改它。

    还有一点需要注意 - 此搜索仅适用于完全匹配。如果您不想强制完全匹配,请添加 % 通配符。

    OPEN get_user_details FOR
     'SELECT login, emp_id, surname, forename, middlename, date_of_birth, emp_numb, position, ' || 
          'FROM  my_employment_table ' ||
          ' WHERE 1 = 1 ' ||
         l_login_clause ||
         l_firstname_clause ||
         l_surname_clause ||
         l_empnumb_clause ||
         l_prolist_clause ||
         'ORDER BY surname ';
    
    END emp_pro_search;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 2021-09-11
      • 2019-12-27
      • 2012-12-04
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多