2012-02-03 9 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

の方法は、連結演算子||を使用することですので、あなたの関数がstreetまたはcityで始まる何かを返すことになる、次のようになる:

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と同様にクエリが一致しない場合と同様にエラーが発生します。

あなたは、コード内で意思決定のいくつかの並べ替えを行う必要があります。

このいずれかrankを使用して、インスタンスのために、SQLで行うことができます。タイムスタンプ以下の例では非常に単純化したランキングシステムのためのテーブルへのエントリの日のようになります。

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

ご返信ありがとうございます。 –

関連する問題