سؤال

أنا أكتب إجراءً مخزنًا حيث لدي معلمة إدخال تسمى مقاسي هذا هو عدد صحيح.أريد أن أكون قادرًا على استخدامه في LIMIT جملة في أ SELECT إفادة.يبدو أن هذا غير مدعوم، فهل هناك طريقة للتغلب على ذلك؟

# I want something like:
SELECT * FROM some_table LIMIT my_size;

# Instead of hardcoding a permanent limit:
SELECT * FROM some_table LIMIT 100;
هل كانت مفيدة؟

المحلول

والتفت بحث عن هذه المقالة . لقد لصق النصوص ذات الصلة أدناه.

<اقتباس فقرة>   

وهنا وظيفة منتدى تبين مثال على البيانات المعدة السماح   تعيين قيمة المتغير إلى شرط الحد:

     

http://forums.mysql.com/read. بى؟ 98،126379،133966 # جي اس-133966

     

ولكن، أعتقد أن هذا خلل يجب ان تحصل على بعض الاهتمام لأنني لا أستطيع   تخيل أن البيانات المعدة داخل إجراء سيسمح لأي   تحسينات إجراء الترجمة من الوقت. لدي شعور بأن أعدت   ويتم تجميع البيانات وتشغيلها في وقت تشغيل الإجراء،   التي لديها probaby له تأثير سلبي على كفاءة. إذا كان الحد الأقصى   الشرط يمكن أن يقبل المتغيرات الإجراء العادي (مثلا، إجراء   الحجة)، ثم قاعدة بيانات يمكن سيستمر في تنفيذ الترجمة في الوقت   تحسينات على بقية الاستعلام، ضمن الإجراء. هذه   من المرجح أن تسفر عن تنفيذ أسرع من هذا الإجراء. أنا لست خبيرا   بالرغم من ذلك.

نصائح أخرى

وبالنسبة لأولئك الذين لا يستطيعون استخدام الخلية 5.5.6+ و لا تريد أن تكتب إجراء مخزن، هناك متغير آخر. ويمكننا أن نضيف بندا حيث على subselect مع ROWNUM.

SET @limit = 10;
SELECT * FROM (
  SELECT instances.*, 
         @rownum := @rownum + 1 AS rank
    FROM instances, 
         (SELECT @rownum := 0) r
) d WHERE rank < @limit;

الإجراء المخزن

DELIMITER $
create PROCEDURE get_users(page_from INT, page_size INT)
begin
SET @_page_from = page_from;
SET @_page_size = page_size;
PREPARE stmt FROM "select u.user_id, u.firstname, u.lastname from users u limit ?, ?;";
EXECUTE stmt USING @_page_from, @_page_size;
DEALLOCATE PREPARE stmt;
end$
DELIMITER ;

الاستخدام

call get_users(1, 10);

وأنا أعرف هذه الإجابة قد حان وقت متأخر، ولكن في محاولة SQL_SELECT_LIMIT.

مثال:

Declare rowCount int;
Set rowCount = 100;
Set SQL_SELECT_LIMIT = rowCount;
Select blah blah
Set SQL_SELECT_LIMIT = Default;

وهناك طريقة أخرى، والشيء نفسه كما كتب "براديب سانجايا"، ولكن باستخدام CONCAT:

CREATE PROCEDURE `some_func`(startIndex INT, countNum INT)
READS SQL DATA
  COMMENT 'example'
BEGIN
  SET @asd = CONCAT('SELECT `id` FROM `table` LIMIT ',startIndex,',',countNum);
  PREPARE zxc FROM @asd;
  EXECUTE zxc;
END;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top