2011-08-26 13 views
14

में मेरे पास एक ऐसा फ़ंक्शन है जो my_table%ROWTYPE प्रकार के साथ रिकॉर्ड लौटाएगा, और कॉलर में, मैं जांच सकता हूं कि लौटा हुआ रिकॉर्ड शून्य है या नहीं, लेकिन पीएल/एसक्यूएल अगर कथन को शिकायत करता है किएक रिकॉर्ड की जांच करें plsql

PLS-00,306:

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; 

धन्यवाद: गलत नंबर या करने के लिए कॉल में तर्क के प्रकार

यहाँ मेरी कोड है 'नहीं है शून्य'।

उत्तर

22

जहाँ तक मुझे पता है, यह संभव नहीं है। PRIMARY KEY या NOT NULL कॉलम की जांच करना पर्याप्त होना चाहिए।


आप v_record.row_id IS NULL के लिए देख सकते हैं।

आपका फ़ंक्शन NO_DATA_FOUND अपवाद फेंक देगा हालांकि, जब कोई रिकॉर्ड नहीं मिलता है।

+1

आपके उत्तर के लिए धन्यवाद। क्या यह रिकॉर्ड करने का एकमात्र तरीका है कि रिकॉर्ड शून्य है? यह मेरे लिए अजीब बात है कि हम रिकॉर्ड को शून्य कर सकते हैं, लेकिन यह जांच नहीं सकते कि रिकॉर्ड शून्य है या नहीं। – Sapience

+2

जहां तक ​​मुझे पता है, यह संभव नहीं है। हालांकि 'प्राथमिक कुंजी' या 'न्यूल न्यूल' कॉलम की जांच करना पर्याप्त होना चाहिए। –

+1

अच्छा कामकाज! मैं रिकॉर्ड करने के लिए 'NULL' के असाइनमेंट का उपयोग करता हूं और यह जांच करने का तरीका है! +1 – gavenkoa

3

आप इस चर के अस्तित्व के लिए परीक्षण नहीं कर सकते हैं, इसलिए इसके बारे में जाने के दो तरीके हैं। एक तत्व के अस्तित्व की जांच करें। मुझे यह पसंद नहीं है क्योंकि इसका मतलब है कि अगर आपका कोड कुछ भी बदलता है तो अब काम नहीं करता है। इसके बजाय वहां कोई अपवाद क्यों न उठाएं जब वहां कोई डेटा न हो:

मुझे एहसास है कि अपवाद में 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;