タイプmy_table%ROWTYPE
のレコードを返す関数があり、呼び出し側で、返されたレコードがnullであるかどうかを確認できましたが、PL/SQLはifステートメントで
PLS-00306: 'IS NOT NULL'へのコールでの引数の数またはタイプが間違っています
これが私のコードです:
v_record my_table%ROWTYPE;
v_row_id my_table.row_id%TYPE := 123456;
begin
v_record := myfunction(v_row_id)
if (v_record is not null) then
-- do something
end if;
end;
function myfunction(p_row_id in my_table.row_id%TYPE) return my_table%ROWTYPE is
v_record_out my_table%ROWTYPE := null;
begin
select * into v_record_out from my_table
where row_id = p_row_id;
return v_record_out;
end myfunction;
ありがとう。
私の知る限り、それは不可能です。ただし、PRIMARY KEY
列またはNOT NULL
列を確認するだけで十分です。
v_record.row_id IS NULL
を確認できます。
ただし、レコードが見つからない場合、関数はNO_DATA_FOUND
例外をスローします。
この変数が存在しないことをテストすることはできないため、2つの方法で対処できます。単一の要素の存在を確認します。何か変更を加えるとコードが機能しなくなるので、これは好きではありません。代わりに、そこにデータがないときに例外を発生させないのはなぜですか。
例外のothers
は非常にいたずらであることに気づきましたが、実際には、テーブルが消えてはいけないときに消えるだけで、他には何もありません。
v_record my_table%ROWTYPE;
v_row_id my_table.row_id%TYPE := 123456;
begin
v_record := myfunction(v_row_id)
exception when others then
-- do something
end;
function myfunction(p_row_id in my_table.row_id%TYPE) return my_table%ROWTYPE is
v_record_out my_table%ROWTYPE := null;
cursor c_record_out(c_row_id char) is
select *
from my_table
where row_id = p_row_id;
begin
open c_record_out(p_row_id);
fetch c_record_out into v_record_out;
if c_record_out%NOTFOUND then
raise_application_error(-20001,'no data);
end if;
close c_record_out;
return v_record_out;
end myfunction;