মাইএসকিএল - সঞ্চিত পদ্ধতি থেকে কীভাবে প্রস্থান / প্রস্থান করা যায়


131

আমার খুব সাধারণ প্রশ্ন আছে তবে এসকি থেকে মাইকিউএল ব্যবহার করে বেরিয়ে আসার জন্য আমি কোনও সাধারণ কোড পাইনি। কীভাবে কেউ আমার সাথে ভাগ করে নিতে পারেন?

CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
BEGIN
     IF tablename IS NULL THEN
          #Exit this stored procedure here
     END IF;

     #proceed the code
END;

1
অথবা, আপনি ব্যবহার করতে পারেন IF tablename IS NOT NULL THEN...;)
ওএমজি পনিস

4
আমি শর্ট কাট জরিমানা করার চেষ্টা করছি ... অন্যথায় আমাকে আইএফ স্টেটমেন্টের অভ্যন্তরে কোড করতে হবে, এবং এটি কেবলমাত্র এক্সটাইট স্টেটমেন্ট নয় ... স্টোরকৃত প্রকের ভিতরে একাধিক আইফির পরিবর্তে আমাদের বহির্গমনের প্রয়োজন।
জো ইজাম

ভাল রেফারেন্স URL টি: bytes.com/topic/mysql/answers/...
Avishek

উত্তর:


204
CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
proc_label:BEGIN
     IF tablename IS NULL THEN
          LEAVE proc_label;
     END IF;

     #proceed the code
END;

1
গ্রেট! এমনকি আপনি এটিও উল্লেখ করতে পারেন যে END proc_label;সিনট্যাক্সের (বেশিরভাগ অফিসিয়াল মাইএসকিউএল উদাহরণগুলিতে দেখানো) দরকার নেই। (স্থানে রাখার জন্য নীচে স্ক্রোল না করে */

2
আপনি কি ছেড়ে দিতে পারেন এবং একটি মূল্য ফেরত দিতে পারেন?
ygaradon

35
প্রতিটি প্রকারের 'এই_প্রোক' এর শুরু করুন কেবল লেগেল করুন। কারণ LEAVE this_proc;নিখুঁত শোনায়!
এসএনএগ

@ ইগারাডন সঞ্চিত পদ্ধতিগুলি মানগুলি ফেরায় না। আপনার একটি সঞ্চিত ফাংশন ব্যবহার করতে হবে এবং return <value>একটি মান ফেরত দিতে হবে।
ডেভিড হার্কনেস

1
আমি মনে করি স্থান প্রয়োজন মধ্যে :এবং BEGINযেমন proc_label:BEGINবাক্যগঠন ত্রুটি দিলেন যখন proc_label: BEGINকাজ করেন।
উমাইর মালহি

13

আপনি যদি কোনও পরিস্থিতির জন্য কোনও "প্রাথমিক প্রস্থান" চান যেখানে কোনও ত্রুটি নেই, তবে @ পাইওটর্ম পোস্ট করা স্বীকৃত উত্তরটি ব্যবহার করুন। তবে সাধারণত কোনও ত্রুটির শর্তের কারণে আপনি জামিন পাবেন (বিশেষত একটি এসকিউএল পদ্ধতিতে)।

মাইএসকিউএল ভি 5.5 হিসাবে আপনি একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারেন। ব্যতিক্রম হ্যান্ডলার ইত্যাদি নেতিবাচক যা একই ফলাফল অর্জন করবে, তবে একটি ক্লিনার, আরও মারাত্মক পদ্ধতিতে।

এখানে কীভাবে:

DECLARE CUSTOM_EXCEPTION CONDITION FOR SQLSTATE '45000';

IF <Some Error Condition> THEN      
    SIGNAL CUSTOM_EXCEPTION
    SET MESSAGE_TEXT = 'Your Custom Error Message';
END IF;     

নোটটি SQLSTATE '45000'"আনহানডেল ব্যবহারকারী-সংজ্ঞায়িত ব্যতিক্রম শর্ত" এর সমান। ডিফল্টরূপে, 1644এটির একটি ত্রুটি কোড তৈরি হবে (যার একই অর্থ রয়েছে)। নোট করুন যে আপনি চাইলে অন্যান্য শর্তের কোড বা ত্রুটি কোডগুলি ফেলে দিতে পারেন (ব্যতিক্রম হ্যান্ডলিংয়ের জন্য অতিরিক্ত বিশদ) details

এই বিষয়ে আরও তথ্যের জন্য, দেখুন:

https://dev.mysql.com/doc/refman/5.5/en/signal.html

মাইএসকিউএল ফাংশনের মধ্যে কীভাবে ত্রুটি বাড়ানো যায়

http://www.databasejournal.com/features/mysql/mysql-error-handling-using-the-signal-and-resignal-statements.html

অভিযোজ্য বস্তু

আমি যখন আমার এই পোস্টটি পুনরায় পড়ছি তখন বুঝতে পারি আমার যুক্ত করার অতিরিক্ত কিছু আছে। মাইএসকিউএল ভি 5.5 এর আগে একটি ব্যতিক্রম ছুঁড়ে অনুকরণ করার একটি উপায় ছিল। এটি হুবহু একই জিনিস নয়, তবে এটি ছিল অ্যানালগ: কোনও প্রক্রিয়া কল করার মাধ্যমে একটি ত্রুটি তৈরি করুন যা বিদ্যমান নেই। প্রক্রিয়াটি একটি নাম দিয়ে কল করুন যা একটি কার্যকর উপায় পাওয়ার জন্য অর্থবোধক যার মাধ্যমে সমস্যাটি কী তা নির্ধারণ করা যায়। ত্রুটি দেখা দিলে, আপনি ব্যর্থতার লাইনটি দেখতে পাবেন (আপনার নির্বাহের প্রসঙ্গে)।

উদাহরণ স্বরূপ:

CALL AttemptedToInsertSomethingInvalid;

মনে রাখবেন যে আপনি যখন কোনও পদ্ধতি তৈরি করেন, তখন এই জাতীয় জিনিসগুলির কোনও বৈধতা দেওয়া হয় না। সংকলিত ভাষার মতো কিছু করার সময়, আপনি কখনই কোনও ফাংশনটি কল করতে পারেননি যা ছিল না, এটির মতো স্ক্রিপ্টে এটি রানটাইমে কেবল ব্যর্থ হবে, যা ঠিক এই ক্ষেত্রে পছন্দসই!


1
এটি আমার কাছে সবচেয়ে সঠিক, পুরো উত্তর বলে মনে হচ্ছে এবং আমি যা চেয়েছিলাম ঠিক তা-ই হয়েছিল। ও.পি. এর মতো আমারও বেশ কয়েকটি পরীক্ষা (ইনপুট বৈধতা) চালানো দরকার এবং আমি সেগুলি সব বাসাতে চাইনি, সুতরাং এটি আমার পক্ষে ভাল কাজ করে।
Fodagus

12

এই পরিস্থিতিটিকে বহনযোগ্য উপায়ে পরিচালনা করতে (যেমন সমস্ত ডেটাবেজে কাজ করবে কারণ এটি মাইএসকিউএল লেবেল কুংফু ব্যবহার করে না), প্রক্রিয়াটি যুক্তিযুক্ত অংশগুলিতে বিভক্ত করুন:

CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
BEGIN
     IF tablename IS NOT NULL THEN
         CALL SP_Reporting_2(tablename);
     END IF;
END;

CREATE PROCEDURE SP_Reporting_2(IN tablename VARCHAR(20))
BEGIN
     #proceed with code
END;

7
হায়, পরিবর্তে প্রথম সমাধানটি ব্যবহার করবেন না কেন?
পেসারিয়ার

1
আশা করি আমি এইবার দুবার ভোট দিতে পারতাম। এসকিউএল একটি বাস্তব প্রোগ্রামিং ভাষা নয় বলেই কোনও একক পদ্ধতিতে কাউকে 200+ কোডের লাইন লেখার অজুহাত দেয় না।
ম্যাক্স হাইবার

এই উত্তরটি কি কেবল সাধারণ ভুল বা আমি কিছু অনুপস্থিত? কেন এটি upvotes আছে? স্পষ্টতই এটি অর্জনের জন্য একটি উপায় রয়েছে যা গৃহীত সমাধান দ্বারা প্রদর্শিত হয়।
jlh

@ জেএলএইচ এটি ভুল ছিল (এখন পাঠ্য সংশোধন করা হয়েছে) যে আমি মাইএসকিএল এর লেবেল কৌশল সম্পর্কে জানতাম না, তবে কোডটি ভুল নয় - এটি আসলে কোনও ডিবিতে কাজ করবে।
বোহেমিয়ান

2

কেন এটি না:

CREATE PROCEDURE SP_Reporting(IN tablename VARCHAR(20))
BEGIN
     IF tablename IS NOT NULL THEN
          #proceed the code
     END IF;
     # Do nothing otherwise
END;

7
কোডটি খুব দীর্ঘ ... আমি এটি ব্যবহার করতে পারি না ... এটি কেবলমাত্র একটি নমুনা।
জো ইজাম

দৈর্ঘ্য যতই গুরুত্বপূর্ণ, এটি কার্যকর করবে না।
স্টিফেন

যদি আপনি ইনডেন্টিং সম্পর্কে উদ্বিগ্ন হন তবে ifবিবৃতিতে কেবল পুরো বিভাগটি আনইন্ডেন্ট করুন । এটি যৌক্তিকভাবে "প্রারম্ভিক প্রত্যাবর্তনের" সাথে সমান।
বোবোবোবো

@ বোবোবো, তিনি তার ক্ষেত্রে বলছেন এটি যৌক্তিকভাবে অনেক বেশি বোঝায় যে এই বর্গক্ষেত্রের সীমাবদ্ধতার চারপাশে যুক্তি পুনর্বিবেচনা করা উচিত নয়।
পেসারিয়ার

1
হতে পারে "প্রচুর চেকের সাথে যদি তার এক্সটেনশান = -1 হয়" তবে প্রচুর চেকের সাথে তার লগইন থাকতে পারে। আপনি চান এটি সত্যিই জিনিসগুলি করা বন্ধ করুন। এটি ifs এর জটিলতা হ্রাস করে। কম {id এনিডেটেড
বোরজব

2

এটি আমার পক্ষে কাজ করে:

 CREATE DEFINER=`root`@`%` PROCEDURE `save_package_as_template`( IN package_id int , 
IN bus_fun_temp_id int  , OUT o_message VARCHAR (50) ,
            OUT o_number INT )
 BEGIN

DECLARE  v_pkg_name  varchar(50) ;

DECLARE  v_pkg_temp_id  int(10)  ; 

DECLARE  v_workflow_count INT(10);

-- checking if workflow created for package
select count(*)  INTO v_workflow_count from workflow w where w.package_id = 
package_id ;

this_proc:BEGIN   -- this_proc block start here 

 IF  v_workflow_count = 0 THEN
   select 'no work flow ' as 'workflow_status' ;
    SET o_message ='Work flow is not created for this package.';
    SET  o_number = -2 ;
      LEAVE this_proc;
 END IF;

select 'work flow  created ' as 'workflow_status' ;
-- To  send some message
SET o_message ='SUCCESSFUL';
SET  o_number = 1 ;

  END ;-- this_proc block end here 

END

0
MainLabel:BEGIN

IF (<condition>) IS NOT NULL THEN
    LEAVE MainLabel;
END IF; 

....code

i.e.
IF (@skipMe) IS NOT NULL THEN /* @skipMe returns Null if never set or set to NULL */
     LEAVE MainLabel;
END IF;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.