2011-08-26 39 views
14

Tôi có một hàm sẽ trả về bản ghi với loại my_table%ROWTYPE và trong người gọi, tôi có thể kiểm tra xem bản ghi đã trả về có rỗng hay không, nhưng PL/SQL than phiền câu lệnh ifKiểm tra bản ghi IS NOT NULL trong plsql

PLS-00.306: số sai hoặc loại lập luận trong lời kêu gọi 'iS NOT NULL'

đây là mã của tôi:

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; 

Cảm ơn.

Trả lời

22

Theo như tôi biết, điều đó là không thể. Tuy nhiên, hãy kiểm tra cột PRIMARY KEY hoặc một cột NOT NULL.


Bạn có thể kiểm tra v_record.row_id IS NULL.

Chức năng của bạn sẽ ném một ngoại lệ NO_DATA_FOUND mặc dù, khi không tìm thấy bản ghi nào.

+1

Cảm ơn câu trả lời của bạn. Đó có phải là cách duy nhất để kiểm tra nếu một bản ghi là null không? Thật lạ với tôi rằng chúng ta có thể gán null cho một bản ghi, nhưng không thể kiểm tra nếu một bản ghi là null. – Sapience

+2

Theo như tôi biết, điều đó là không thể. Việc kiểm tra cột 'PRIMARY KEY' hoặc cột' NOT NULL' là đủ. –

+1

Giải pháp tốt! Tôi sử dụng phân công 'NULL' để ghi lại và đây là cách để kiểm tra! +1 – gavenkoa

3

Bạn không thể kiểm tra sự tồn tại của biến này để có hai cách để thực hiện. Kiểm tra sự tồn tại của một phần tử đơn lẻ. Tôi không thích điều này vì nó có nghĩa là nếu bất cứ điều gì thay đổi mã của bạn không còn hoạt động. Thay vào đó, tại sao không chỉ đưa ra ngoại lệ khi không có dữ liệu ở đó:

Tôi nhận thấy rằng others trong ngoại lệ rất nghịch ngợm nhưng nó sẽ chỉ thực sự bắt bảng của tôi biến mất khi không nên và không có gì khác.

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; 
Các vấn đề liên quan