نحوه ایجاد یک Stored Procedures در MySQL5- بخش اول

برای کار با بانک اطلاعاتی روش های متداول و مرسوم زیادی وجود دارد. اما یک روشی که خیلی مورد پسند بنده واقع شده، روشی است که در آن با استفاده از استور پروسیجرها کار هایم با دیتابیس را انجام می دهم. استور پروسیجر ها امکانی است که برخی نرم افزارهای مدیریت پایگاه داده ها آن را حمایت کرده و برخی خیر. از جلمه این پایگاه داده ها می توان از MySQL، MSSQL و... نام برد.در این نوشته نحوه ایجاد و کار با این امکان در نرم افزار مدیریت پایگاه داده های MySQL را بیان می کنم.در بخش اول سعی شد تعریفی مختصر و طریقه ایجاد، فراخوانی، تعریف پارامترها و متغییرها را عنوان کرده و ادامه آن را در این قسمت خدمت دوستان ارائه می کنم.

گام ۴ : متغییرها

در این گام نحوه تعریف متغییرها و ذخیره دادها در استور پروسیجر را با هم می آموزیم. تعریف متغییرها دقیقا در ابتدای بلاک BEGIN و END به همراه تعیین نوع آنها انجام می گیرد.تعریف متغییر به صورت زیر می باشد:

DECLARE varname DATA-TYPE DEFAULT defaultvalue;
مثالهایی از تعریف انواع متغییرها:
DECLARE a, b INT DEFAULT 5;
DECLARE str VARCHAR(50);
DECLARE today TIMESTAMP DEFAULT CURRENT_DATE;
DECLARE v1, v2, v3 TINYINT;
کار کردن با متغییرها

به منظور تخصیص مقدار به متغییرهای تعریف شده کافی است از دستورات SET یا SELECT استفاده نمایید:

DELIMITER //
CREATE PROCEDURE `var_proc` (IN paramstr VARCHAR(20))
BEGIN
  DECLARE a, b INT DEFAULT ۵;
  DECLARE str VARCHAR(50);
  DECLARE today TIMESTAMP DEFAULT CURRENT_DATE;
  DECLARE v1, v2, v3 TINYINT;
  INSERT INTO table1 VALUES (a);
  SET str = ’I am a string’;
  SELECT CONCAT(str,paramstr), today FROM table2 WHERE b >=5;
END //
گام ۵ : کنترل روند اجرا برنامه در استور پروسیجرها

نرم افزار MySQL از ساختارهای کنترل روند اجرا IF, CASE, ITERATE, LEAVE LOOP, WHILE و REPEAT پشتیبانی می کند در این نوشته سعی می شود تا درباره ساختار هایی که بیشتر مرسوم و مورد استفاده هستند از قبیل IF, CASE و WHILE صحبت کنیم.

ساختار IF

با این ساختار بخش هایی از برنامه که شامل شروط هستند را کنترل می کنیم.

DELIMITER //
CREATE PROCEDURE `proc_IF` (IN param1 INT)
BEGIN
  DECLARE variable1 INT;
  SET variable1 = param1 + 1;
   IF variable1 = 0 THEN
     SELECT variable1;
   END IF;
   IF param1 = 0 THEN
  SELECT 'Parameter value = 0';
   ELSE
  SELECT 'Parameter value <> 0';
   END IF;
END //
ساختار CASE

این ساختار نیز برای کنترل شروط در برنامه می باشد. اما نمی توان از آن دقیقا به جا ساختارIF استفاده کرد. دو راه برای استفاده از این ساختار وجود دارد. راه اول:

DELIMITER //
CREATE PROCEDURE `proc_CASE` (IN param1 INT)
BEGIN
  DECLARE variable1 INT;
  SET variable1 = param1 + 1;
  CASE variable1
       WHEN 0 THEN
          INSERT INTO table1 VALUES (param1);
       WHEN 1 THEN
          INSERT INTO table1 VALUES (variable1);
        ELSE
          INSERT INTO table1 VALUES (99);
  END CASE;
END //
راه دوم:
DELIMITER //
CREATE PROCEDURE `proc_CASE` (IN param1 INT)
BEGIN
  DECLARE variable1 INT;
  SET variable1 = param1 + 1;
  CASE
    WHEN variable1 = 0 THEN
       INSERT INTO table1 VALUES (param1);
    WHEN variable1 = 1 THEN
       INSERT INTO table1 VALUES (variable1);
     ELSE
       INSERT INTO table1 VALUES (99);
  END CASE;
END //
ساختار WHILE

در اصل سه نوع ساختار حلقه وجود دارد. حلقه WHILE، حلقه LOOP و حلقه REPEAT. و اختیار با شما است که از کدام نوع ساختار در برنامه استفاده کنید. در اینجا فقط حلقه WHILEگفته می شود:

DELIMITER //
CREATE PROCEDURE `proc_WHILE` (IN param1 INT)
BEGIN
  DECLARE variable1, variable2 INT;
  SET variable1 = 0;
  WHILE variable1 < param1 DO
      INSERT INTO table1 VALUES (param1);
      SELECT COUNT(*) INTO variable2 FROM table1;
      SET variable1 = variable1 + 1;
  END WHILE;
END //

گام ۶ : اشاره گرها یا Cursors

از این امکان جهت واکاوی و پردازش هر سطر، در میان چند سطر از یک کوئری برگردانده شده را فراهم می کند.این امکان نیز در MySQL هم برای استفاده در استور پروسیجرها ایجاد شده است. یک مثال ساده برای ایجاد و استفاده از یک اشاره گر:

DECLARE cursor-name CURSOR FOR SELECT ...;  /*Declare and populate the cursor with a SELECT statement */
DECLARE  CONTINUE HANDLER FOR NOT FOUND          /*Specify what to do when no more records found*/
OPEN cursor-name;                                /*Open cursor for use*/
FETCH cursor-name INTO variable [, variable];    /*Assign variables with the current column values*/
CLOSE cursor-name;                               /*Close cursor after use*/

و حالا مثالی اشاره گر استفاده شده در پروسیجر:

DELIMITER //
CREATE PROCEDURE `proc_CURSOR` (OUT param1 INT)
BEGIN
  DECLARE a, b, c INT;
  DECLARE cur1 CURSOR FOR SELECT col1 FROM table1;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;
  OPEN cur1;
  SET b = 0;
  SET c = 0;
  WHILE b = 0 DO
      FETCH cur1 INTO a;
      IF b = 0 THEN
         SET c = c + a;
      END IF;
  END WHILE;
  CLOSE cur1;
  SET param1 = c;
END //

اشاره گرها دارای سه ویژگی هستند که برای استفاده از آنها باید با این ویژگی ها آشنا باشید:

  • Asensitive: هنگامی که باز است، اشاره گر تغییرات را درون جدول مربوطه انعکاس نمی دهد. در واقع، MySQL از اشاره گری که بهروز رسانی می کند، ضمانت نمی کند.
  • Read Only: اشاره گر قابل به روز رسانی نمی باشد.
  • Not Scrollable: اشاره گر فقط می تواند در یک مسیر، به سمت جلو، حرکت کرده و نمی توانید از واکاوی رکودها گذر کنید.

و در پایان باید گفت که در این دو نوشته سعی شده بود تا به طور مختصر ولی جامع توضیحاتی را پیرامون Stored Procedure ها در MySQL بیان کنیم. البته برای کار با این امکان هنوز نیاز با اطلاعات بیشتری می باشد که بهتر است درباره آن جستجو کنید.بنده را از نظرات سازنده و اشکالات موجود محروم نفرمایید.

برچسب ها: database sql mysql stored_procedure
من در stackexchange.com