我正在尝试使用传递给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
功能?
答案 0 :(得分:1)
与参数一样使用的方法是使用连接运算符||
,因此您的函数将如下所示,它将返回以street
或city
开头的任何内容:< / 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中做出决定。