আসলে আমি প্রতিটি বিবৃতিতে একমত হতে পারি না।
"COALESCE আশা করে যে সমস্ত আর্গুমেন্ট একই ডেটাটাইপের হবে" "
এটি ভুল, নীচে দেখুন। আর্গুমেন্টগুলি বিভিন্ন ডেটা ধরণের হতে পারে, এটিও নথিভুক্ত করা হয় : যদি এক্সপ্রেসের সমস্ত উপস্থিতি সংখ্যাসূচক ডেটা টাইপ হয় বা কোনও সংখ্যাসূচক ডেটা টাইপ হয় যা স্পষ্টভাবে একটি সংখ্যাসূচক ডেটা টাইপে রূপান্তরিত করা যায় তবে ওরাকল ডাটাবেস সুস্পষ্টভাবে সর্বোচ্চ সংখ্যার অগ্রাধিকার সহ যুক্তিটি নির্ধারণ করে অবশিষ্ট আর্গুমেন্টগুলি সেই তথ্য প্রকারে রূপান্তরিত করে এবং সেই তথ্য প্রকারটি প্রদান করে। । প্রকৃতপক্ষে এটি সাধারণ অভিব্যক্তির বিপরীতেও রয়েছে "COALESCE একটি নন-নাল মানের প্রথম মুহূর্তে থামে", অন্যথায় পরীক্ষার ক্ষেত্রে নং 4 ত্রুটি বাড়াতে হবে না।
পরীক্ষার কেস নং 5 অনুসারে COALESCE
তর্কগুলির অন্তর্নিহিত রূপান্তর করে।
DECLARE
int_val INTEGER := 1;
string_val VARCHAR2(10) := 'foo';
BEGIN
BEGIN
DBMS_OUTPUT.PUT_LINE( '1. NVL(int_val,string_val) -> '|| NVL(int_val,string_val) );
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('1. NVL(int_val,string_val) -> '||SQLERRM );
END;
BEGIN
DBMS_OUTPUT.PUT_LINE( '2. NVL(string_val, int_val) -> '|| NVL(string_val, int_val) );
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('2. NVL(string_val, int_val) -> '||SQLERRM );
END;
BEGIN
DBMS_OUTPUT.PUT_LINE( '3. COALESCE(int_val,string_val) -> '|| COALESCE(int_val,string_val) );
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('3. COALESCE(int_val,string_val) -> '||SQLERRM );
END;
BEGIN
DBMS_OUTPUT.PUT_LINE( '4. COALESCE(string_val, int_val) -> '|| COALESCE(string_val, int_val) );
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('4. COALESCE(string_val, int_val) -> '||SQLERRM );
END;
DBMS_OUTPUT.PUT_LINE( '5. COALESCE(SYSDATE,SYSTIMESTAMP) -> '|| COALESCE(SYSDATE,SYSTIMESTAMP) );
END;
Output:
1. NVL(int_val,string_val) -> ORA-06502: PL/SQL: numeric or value error: character to number conversion error
2. NVL(string_val, int_val) -> foo
3. COALESCE(int_val,string_val) -> 1
4. COALESCE(string_val, int_val) -> ORA-06502: PL/SQL: numeric or value error: character to number conversion error
5. COALESCE(SYSDATE,SYSTIMESTAMP) -> 2016-11-30 09:55:55.000000 +1:0 --> This is a TIMESTAMP value, not a DATE value!