পিএল / পিজিএসকিউএল-এ কোনও সহজ উপায় আছে কিনা তা পরীক্ষা করে দেখার জন্য যে কোনও প্রশ্নের কোনও ফল পাওয়া যায়নি?


16

আমি বর্তমানে পিএল / পিজিএসকিউএল নিয়ে কিছুটা পরীক্ষা নিরীক্ষা করছি এবং এর মতো আরও কিছু করার মতো আরও মার্জিত উপায় আছে কিনা তা জানতে চাই:

select c.data into data from doc c where c.doc_id = id and c.group_cur > group_cur order by c.id desc limit 1;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        select c.data into data from doc c where c.doc_id = id and c.global_cur > global_cur order by c.id desc limit 1;
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
                RETURN NULL;

উত্তর:


21

ব্যতিক্রম ব্লকগুলি ফাঁদে ত্রুটির জন্য বোঝানো হয়, শর্তাদি পরীক্ষা করে না। অন্য কথায়, সংকলনের সময় যদি কিছু শর্ত পরিচালনা করা যায় তবে এটিকে ত্রুটি হিসাবে আটকে রাখা উচিত নয় তবে সাধারণ প্রোগ্রাম লজিক দ্বারা সমাধান করা উচিত।

ইন পিএল / PgSQL ডকুমেন্টেশন ফাঁদে ত্রুটি অধ্যায় আপনি এই ধরনের টিপ পেতে পারবেন:

টিপ: এক্সেসপশন ক্লজ সহ একটি ব্লক প্রবেশ ছাড়তে এবং প্রস্থান ছাড়াই উল্লেখযোগ্যভাবে বেশি ব্যয়বহুল। অতএব, প্রয়োজন ছাড়াই এক্সেসপশন ব্যবহার করবেন না।

ব্যতিক্রম (খারাপ), বা আইএফ / THEN / ELSIF (আরও ভাল) ব্যবহার না করে আপনি এটিকে একটি প্রশ্নের কাছে আবার লিখতে পারেন:

SELECT c.data into data
FROM  doc c
WHERE c.doc_id = id
  and (
    c.group_cur > group_cur
    or
    c.global_cur > global_cur
  )
ORDER BY
  -- this will make group always preferred over global
  case when c.group_cur > group_cur then 1 else 2 end ASC,
  -- and this is your normal ordering
  c.id DESC
limit 1;

আপনি যদি সত্যিই দুটি প্রশ্ন চান তবে পূর্বের ক্যোয়ারিতে কোনও ফলাফল দিয়েছে কিনা তা পরীক্ষা করতে আপনি বিশেষ ফাউন্ড ভেরিয়েবল ব্যবহার করতে পারেন:

select c.data into data
from doc c
where c.doc_id = id and c.group_cur > group_cur
order by c.id desc limit 1;
if not found then
    select c.data into data
    from doc c
    where c.doc_id = id and c.global_cur > global_cur
    order by c.id desc limit 1;
    if not found then return null; end if;
end if;

বাধ্যতামূলক আরটিএফএম লিঙ্কগুলি :-)

দেখুন এই বর্নণার জন্য FOUNDপরিবর্তনশীল, এবং এই জন্য IF/ THENব্লক।


13

আপনি টাইপ বুলিয়ানের একটি বিশেষ চলক FOUND পরীক্ষা করতে পারেন can ডকুমেন্টেশন থেকে:

প্রতিটি পিএল / পিজিএসকিউএল ফাংশন কলের মধ্যে ফাউন্ডটি মিথ্যা সূচনা করে। এটি নীচের প্রতিটি ধরণের বিবৃতি দ্বারা সেট করা হয়:

একটি নির্বাচনের অন্তর্ভুক্ত বিবৃতিটি যদি একটি সারি নির্ধারিত হয় তবে সত্যটি নির্ধারণ করে, যদি কোনও সারি ফেরত না দেওয়া হয় তবে মিথ্যা।

একটি পারফর্ম বিবৃতিটি যদি সত্য হয় যে এটি যদি এক বা একাধিক সারি তৈরি করে (এবং বাতিল করে দেয়), কোনও সারি উত্পাদিত না হলে মিথ্যা।

আপডেট করুন, অন্তর্ভুক্ত করুন, এবং মুছে ফেলুন স্টেটমেন্টগুলি কমপক্ষে একটি সারি প্রভাবিত হলে মিথ্যা সত্য সেট করে, যদি কোনও সারি প্রভাবিত না হয় তবে মিথ্যা।

একটি FETCH স্টেটমেন্টটি যদি একটি সারি ফেরত দেয় তবে সত্যটি সেট করে, যদি কোনও সারি ফিরে না আসে তবে মিথ্যা।

একটি সরানো বিবৃতি যদি সঠিকভাবে কার্সারকে অন্যথায় মিথ্যা হিসাবে অবস্থিত করে তবে এটি সত্যকে সেট করে।

একটি বা পূর্বে বিবৃতি যদি এক বা একাধিকবার পুনরাবৃত্তি করে তবে অন্যথায় মিথ্যা সেট করে OU লুপটি প্রস্থান করলে ফাউন্ডটি এইভাবে সেট করা হয়; লুপের নির্বাহের ভিতরে, ফাউন্ডটি লুপের বিবৃতি দ্বারা পরিবর্তিত হয় না, যদিও এটি লুপের শরীরে অন্য বিবৃতি প্রয়োগের মাধ্যমে পরিবর্তিত হতে পারে।

রিটার্ন QUERY এবং রিটার্ন QUERY এক্সিকিউট স্টেটমেন্টগুলি সত্য প্রমাণিত হয়েছে যদি ক্যোয়ারী কমপক্ষে একটি সারিতে প্রত্যাবর্তন করে, কোনও সারি ফেরত না দেওয়া হলে মিথ্যা।

অন্যান্য পিএল / পিজিএসকিউএল স্টেটমেন্টগুলি ফাউন্ডের অবস্থা পরিবর্তন করে না। বিশেষত নোট করুন যে এক্সিকিউটি ডিআইজিএনজিস্টিকগুলি গেটের আউটপুট পরিবর্তন করে তবে ফাউন্ড পরিবর্তন করে না।

FOUND প্রতিটি পিএল / পিজিএসকিউএল ফাংশনের মধ্যে একটি স্থানীয় পরিবর্তনশীল; এটির যে কোনও পরিবর্তন কেবলমাত্র বর্তমান ক্রিয়াকে প্রভাবিত করে।


কিন্তু select intoযে কোনও তথ্য ফেরত দেয় তা এখনও একটি ব্যতিক্রম বাড়াবে, তাই না?
জ্যাক বলেছেন টপান্সওয়ার্স.অক্সিজ

3
সাধারণত না, কেবলমাত্র ব্যতিক্রমগুলি উত্থাপিত হয় যদি স্ট্রিক্ট ধারাটি নির্দিষ্ট করা থাকে যেমন নির্বাচন করুন * আমার রেকর্ডটি
শক্ত করুন

আহা হ্যাঁ, আমার খারাপ - যদিও এর অর্থ এই নয় যে ওপি উদাহরণের ব্যতিক্রম হ্যান্ডলারটি কখনই আগুন জ্বলবে না? :-)
জ্যাক বলেছেন টপান্সওয়ার্স.অ্যাক্সিজ

1
@ জ্যাকডুগ্লাস: কোনও তথ্যই সাধারণত ব্যতিক্রম হওয়ার কারণ নয় (উপরের স্ট্রাইকটি সংশোধনকারী এর মতো বিশেষ ক্ষেত্রে বাদে)। ওপির সেখানে একটি ভুল ধারণা ছিল।
এরউইন ব্র্যান্ডসেটেটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.