3

パラメータとして郊外を取ることでコードが次のようになると、郵便番号を返す pl/sql コード (実際には関数) を書く必要があります。

create or replace 
FUNCTION get_postCode(p_suburb IN varchar2)
RETURN varchar2 
IS
--
v_postcode varchar2;
--
CURSOR c1 IS 
SELECT locality, postcode FROM table_postcode;
--
BEGIN
--
FOR r1 IN c1 
loop
    IF upper(r1.locality) = upper(p_suburb)
    THEN 
      v_postcode := r1.postcode;
      return v_postcode;
    END IF;
exit WHEN c1%notfound;
END loop;
-- return v_postcode;
--
exception WHEN others then
v_postcode := null;  
END; 

table_postcode は郵便局から取得されたもので、郊外 (テーブルの列としての地域) と郵便番号、およびこのケースには関係のないその他のフィールドが含まれています。

関数を使用すると正しい値が返され、この関数を SELECT 句の列として使用すると、FROM 句の後に句を追加しない場合にのみ返されます。それは私にとって非常に奇妙です。

状況は次のとおりです。

select street, suburb, get_postcode(suburb) from my_table;

上記の行で結果が得られますが、

select street, subur, get_postcode(suburb) from my_table order by suburb;

失敗し、次のエラー メッセージが表示されます。

ORA-06503: PL/SQL: Function returned without value
ORA-06512: at "U11254683.GET_POSTCODE", line 25
06503. 00000 -  "PL/SQL: Function returned without value"
*Cause:    A call to PL/SQL function completed, but no RETURN statement was
       executed.
*Action:   Rewrite PL/SQL function, making sure that it always returns
       a value of a proper type.

次のようなブロックで関数を呼び出す場合:

Declare
v_post varchar2(10);
Begin
v_post := get_postcode('Sydney');
DBMS_OUTPUT.PUT_LINE('The post code is '||v_post);
End;

結果は正しく、2000 になります。

4

2 に答える 2

0

これを試して:

CREATE OR REPLACE FUNCTION get_postCode
(p_suburb IN varchar2)
RETURN varchar2 
IS
    v_postcode varchar2;
    CURSOR c1 IS 
        SELECT locality, postcode FROM table_postcode;
BEGIN
    FOR r1 IN c1 LOOP
        EXIT WHEN c1%notfound;
        IF upper(r1.locality) = upper(p_suburb) THEN 
          v_postcode := r1.postcode;
          EXIT;
        END IF;
    END LOOP;
    return v_postcode;
    exception WHEN others then
    return null;  
END; 
/

FOR最初の郵便番号を見つけてループを終了することにより、TOO_MANY_ROWS例外が発生しないことを保証します。returnまた、ステートメントの外側に置くことで、何も見つからない場合にIF少なくとも aが返されるようにします。NULL

于 2013-05-12T08:36:31.103 に答える