একটি প্রসঙ্গ সহ একটি ব্যতিক্রম উত্পন্ন করুন


13

পোস্টগ্রিএসকিউএল যখন একটি ব্যতিক্রম ছুঁড়ে মারে তখন "CONTEXT" এর মতো একটি লাইন থাকে:

    ERROR:  INSERT has more target COLUMNS than expressions
    LINE 3: ...
                                                         ^
    QUERY:  INSERT INTO ...
    CONTEXT:  PL/pgSQL FUNCTION "XXXXX" line 4 at SQL statement

তবে আমি যখন ব্যতিক্রম ছুঁড়ে ফেলি, তখন এই লাইনটি থাকে না। এটি কীভাবে যুক্ত করব তা আমি খুঁজে পাইনি।

    RAISE EXCEPTION 'blablabla' USING HINT = 'blablablabla';

আমার ব্যতিক্রম এই লাইন যুক্ত করা সম্ভব?

উত্তর:


13

আমি CONTEXTকোনও ব্যবহারকারী-সংজ্ঞায়িত ব্যতিক্রম নিয়ে লাইন আউটপুট দেওয়ার সরাসরি উপায় খুঁজে পাইনি । পোস্টগ্র্রেএসকিউএল 9.1-এ এই বিকল্পটি এখনও প্রয়োগ করা হয়নি (এখনও)। ম্যানুয়াল এখানে পড়ুন
তবে, আমি একটি ...

কার্যসংক্রান্ত

... যে নির্দোষভাবে সঞ্চালন করা উচিত । আপনার জন্য ত্রুটি উত্থাপনকারী একটি অন্য ফাংশন কল করে আপনি পিএলপিগএসকিএলকে পছন্দসই আচরণ করতে পারেন। এটি PostgreSQL 9.0 বা তার পরে কাজ করে
সংস্করণ 8.4 এর জন্য আপনাকে একটি সামান্য সমন্বয় করতে হবে: প্যারামিটারগুলি বরাদ্দ করা যাবে না।

ফাংশন (.. সতর্কবার্তা, বিজ্ঞপ্তি) একটি ত্রুটি বাড়াতে একটি ব্যবহারকারী সংজ্ঞায়িত বার্তা এবং সঙ্গে CONTEXT:

CREATE OR REPLACE FUNCTION f_raise(_lvl text = 'EXCEPTION'
                                 , _msg text = 'Default error msg.')
  RETURNS void AS
$func$
BEGIN
   CASE upper(_lvl)
      WHEN 'EXCEPTION' THEN RAISE EXCEPTION '%', _msg;
      WHEN 'WARNING'   THEN RAISE WARNING   '%', _msg;
      WHEN 'NOTICE'    THEN RAISE NOTICE    '%', _msg;
      WHEN 'DEBUG'     THEN RAISE DEBUG     '%', _msg;
      WHEN 'LOG'       THEN RAISE LOG       '%', _msg;
      WHEN 'INFO'      THEN RAISE INFO      '%', _msg;
      ELSE RAISE EXCEPTION 'f_raise(): unexpected raise-level: "%"', _lvl;
   END CASE;
END
$func$  LANGUAGE plpgsql;

COMMENT ON FUNCTION f_raise(text, text) IS 'Raise error or given level with msg and context.
Call from inside another function instead of raising an error directly
  to get plpgsql to add CONTEXT (with line number) to error message.
$1 .. error level: EXCEPTION | WARNING | NOTICE | DEBUG | LOG | INFO
$2 .. error message';

এই জাতীয় ত্রুটি বাড়াতে ফাংশনটি ব্যবহার করুন:

CREATE OR REPLACE FUNCTION test_err(text)
  RETURNS void AS
$func$
BEGIN
   -- do stuff    

   IF TRUE THEN  -- some condition here?
      -- instead of raising error like this:
      -- RAISE EXCEPTION 'unexpected parameter: "%"', $1;
      PERFORM f_raise('EXCEPTION', 'My message "' || $1 || '"');
   END IF;
END
$func$  LANGUAGE plpgsql;

কল করুন:

SELECT test_err('wrong parameter');

ডিফল্ট মান এবং নামযুক্ত পরামিতি

আমি বাক্য সংশোধন করে ফাংশন সংজ্ঞাতে ডিফল্ট মান যুক্ত করেছি । যদি আপনি এটি পরামিতি (বা শুধুমাত্র একটি) ছাড়াই কল করেন এবং ডিফল্টগুলি অনুপস্থিত মানগুলির জন্য ব্যবহৃত হবে। নামযুক্ত পরামিতিগুলির সাথে একত্রে আপনি বেশ কিছু করতে পারেন। উদাহরণ:

SELECT f_raise();
SELECT f_raise('WARNING');
SELECT f_raise(_msg := 'boohoo');
SELECT f_raise(_lvl := 'WARNING');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.