2012-02-03 65 views
0

我想用传递给我的Oracle函数的输入值来搜索字符串。以下是代码[已修改,因为我无法粘贴原始代码]:使用函数搜索字符串 - 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

使用像参数的方法是使用连接运算符||所以你的函数会像下面这样,这将返回任何与streetcity开始:

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决定。

+0

感谢您的回复。 – 2012-02-06 15:50:38