使用Function - Oracle搜索字符串

时间:2012-02-03 22:29:34

标签: sql oracle11g

我正在尝试使用传递给Oracle函数的输入值来搜索字符串。以下是代码[由于我无法粘贴原始代码而修改]:

CREATE OR REPLACE FUNCTION uf_search_address
(
   street  IN VARCHAR2,
   city    IN VARCHAR2
)
RETURN NUMBER
IS RCVD_PERSON_ID NUMBER;
BEGIN
   SELECT PERSON_ID INTO RCVD_PERSON_ID 
   FROM T_PARTICIPANTS
   WHERE COMPLETE_ADDRESS LIKE street[?] OR COMPLETE_ADDRESS LIKE city[?]
   RETURN (RCVD_PERSON_ID);
END;

但查询无法返回任何内容(但它会编译)。

如何在传递的参数中使用LIKE功能?

1 个答案:

答案 0 :(得分:1)

与参数一样使用的方法是使用连接运算符||,因此您的函数将如下所示,它将返回以streetcity开头的任何内容:< / p>

create or replace function uf_search_address ( P_street IN varchar2
                                             , P_city IN varchar2
                                               ) return number is

   rcvd_person_id number;

begin

   select person_id
     into rcvd_person_id
     from t_participants
    where complete_address like P_street || '%'
       or complete_address like P_city || '%'
          ;

   return rcvd_person_id;

exception when no_data_found then
   return null;

end;
/
show error

然而如果与此查询匹配的一个值超过,则会失败。因为每个城市你有多个人,所以你很可能会尝试做的事情永远不会奏效。另请注意异常处理程序,就好像您的查询没有匹配项Oracle也会抛出错误。

您需要在代码中做出某种决定:

这可以在SQL中完成,例如使用rank。在下面的示例中,时间戳将是进入表格的日期,用于非常简单的排名系统:

select person_id
  into rcvd_person_id
  from ( select person_id
           from ( select person_id
                       , rank() over ( order by timestamp desc ) as rnk
                    from t_participants
                   where complete_address like P_street || '%'
                      or complete_address like P_city || '%'
                         )
          where rnk = 1
                )

或者,您可以通过批量收集所有内容并进行循环来在PL \ SQL中做出决定。