মাইএসকিউএল সঞ্চিত পদ্ধতিতে প্রস্তুত বিবৃতি কীভাবে ব্যবহার করবেন?


16

আমি মাইএসকিএল ব্যবহার করছি এবং পরবর্তী কোয়েরিতে প্রস্তুত বিবৃতি দিয়ে ফিরে আসা কলাম ক্যারিডটি আমার কোনওভাবে ব্যবহার করা দরকার। আমি প্রস্তুত বিবৃতি ব্যবহার করি কারণ যেমনটি আমি পড়েছি, LIMIT টি ধারাতে কোনও ভেরিয়েবল পাস করার একমাত্র উপায়। আমার এখানে এই সঞ্চিত পদ্ধতি রয়েছে:

DROP PROCEDURE IF EXISTS fixbalance;
CREATE PROCEDURE fixbalance (userid INT)
  BEGIN
  DECLARE i INT DEFAULT 0;
  DECLARE balance INT DEFAULT 0;
  DECLARE idcnt INT;

  SET idcnt = (SELECT COALESCE(COUNT(id), 0) 
               FROM coupon_operations 
               WHERE user_id = userid);
  IF idcnt <> 0 THEN
    WHILE i <= idcnt DO
      BEGIN
        SET @iter = i;
        SET @user_id = userid; 
        SET @sql = CONCAT('SELECT id AS curid 
                           FROM coupon_operations 
                           WHERE user_id = ? 
                           ORDER BY id ASC 
                           LIMIT ?, 1');
        PREPARE stmt FROM @sql;
        EXECUTE stmt USING @user_id, @iter;
        DEALLOCATE PREPARE stmt;
        SET balance = balance + (SELECT points 
                                 FROM coupon_operations 
                                 WHERE user_id = @user_id 
                                 AND id = @curid);
        UPDATE coupon_operations SET balance = balance;
        SET i = i + 1;
      END;
    END WHILE;
  END IF;
END;
|

এটি কাজ করে না - আমি কীভাবে দড়িটি পাস করব তা নিশ্চিত নই।

উত্তর:


10

সমাধানটি প্রস্তুত বিবৃতিতে ভেরিয়েবলটি নিজের মতো করে সেট করা ছিল:

SET @sql = CONCAT('SET @curid = SELECT id
                                FROM coupon_operations 
                                WHERE user_id = ? 
                                ORDER BY id ASC 
                                LIMIT ?, 1');

1
CONCATউপরের কোডটির বিন্দু কী?
পেসারিয়ার

@ পেসারিয়ার আপনি CONCATটেবিলের নাম বা প্যারামিটার হিসাবে কিছু না দিলে আপনার ব্যবহারের দরকার নেই । প্রাক্তনCONCAT('select * from ', the_table_name, ' where id>100');
ডেকার্ড


0

এই চেষ্টা করুন। কনটকেট, প্রস্তুতি এবং নমুনা হিসাবে এক্সিকিউট বিবৃতি সমাধান করার জন্য ..

CREATE DEFINER=`products`@`localhost` PROCEDURE `generateMeritList`(
   IN `mastercategory_id` INT(11), 
   IN `masterschools_id` INT(11)
 )
 NO SQL
 begin

  declare total int default 0;
  declare conditions varchar(255) default ''; 
  declare finalQuery varchar(60000) default '';

if mastercategory_id > 0 THEN
    SET conditions =  CONCAT(' and app.masterschools_id = ', mastercategory_id);
end if;

SET @finalQuery = CONCAT(
 "SELECT * FROM applications app INNER JOIN masterschools school ON school.id = app.masterschools_id
WHERE 
 (app.status = 'active'", conditions, " LIMIT ",total); 

 PREPARE stmt FROM @finalQuery;
 EXECUTE stmt;
 DEALLOCATE PREPARE stmt;

end

এই বিশেষ উদাহরণটি ভাল তবে এসকিউএল ইঞ্জেকশনের ঝুঁকির কারণে আমি এটি সাধারণ প্যাটার্ন হিসাবে ব্যবহার করতে নিরুৎসাহিত করব । যদি ইনপুটটি স্ট্রিং ছিল - যেমন ভিআচআরএআর - এর পরিবর্তে আইএনটি, এটি কোনও আক্রমণকারীকে এসকিউএল কোড ইনজেক্ট করার সম্ভাব্য সম্ভাবনা দিত। একটি বাহ্যিক ইনপুট সহ স্ট্রিং সংমিশ্রনের চেয়ে সঠিকভাবে তৈরি একটি বিবৃতি নিরাপদ।
জুয়ানাল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.