سؤال

أود تحديد قيمة واحدة في متغير. حاولت المتابعة:

DECLARE myvar INT(4);

- إرجاع بعض خطأ بناء الجملة على الفور.

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;

- يعيد عدد صحيح واحد

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;

- لا يعمل ، كما حاول myvar

هل من الممكن استخدام الإعلان خارج الإجراءات أو الوظائف المخزنة؟

ربما لا أحصل على مفهوم متغيرات المستخدم ... لقد حاولت للتو:

SELECT myvalue INTO @var FROM `mytable` WHERE uid = 1;
SELECT @var;

... التي عملت تمامًا كما لو كان من المفترض. ولكن إذا قمت بتشغيل كل استعلام في وقت أحصل فيه على @var null.

هل كانت مفيدة؟

المحلول 2

في النهاية ، كان الإجراء المخزن هو الحل لمشكلتي. هنا ما ساعد:

DELIMITER //
CREATE PROCEDURE test ()
  BEGIN
  DECLARE myvar DOUBLE;
  SELECT somevalue INTO myvar FROM mytable WHERE uid=1;
  SELECT myvar;
  END
  //

DELIMITER ;

call test ();

نصائح أخرى

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

SELECT myvalue 
INTO @myvar 
FROM mytable 
WHERE anothervalue = 1;

ومع ذلك ، إذا وضعت هذا الاستعلام نفسه في طاولة عمل MySQL ، فسوف يلقي خطأ في بناء الجملة. لا أعرف لماذا ستكون مختلفة ، لكنها كذلك. للتغلب على المشكلة في Workbench MySQL ، يمكنك إعادة كتابة الاستعلام مثل هذا:

SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;

هذه الإجابات لا تغطي بشكل جيد للغاية متغيرات متعددة.

يؤدي القيام بالمهمة المضمنة في إجراء تخزين إلى إرسال هذه النتائج أيضًا في مجموعة النتائج. يمكن أن يكون مربكا. لاستخدام SELECT ... في بناء جملة مع متغيرات متعددة تقوم بها:

SELECT a, b INTO @a, @b FROM mytable LIMIT 1;

يجب أن يعيد Select صف واحد فقط ، وبالتالي الحد 1 ، على الرغم من أن هذا ليس ضروريًا دائمًا.

يمكنك أيضًا استخدام SET بدلاً من الإعلان

SET @myvar := (SELECT somevalue INTO myvar FROM mytable WHERE uid=1);

SELECT myvar;

لكل مستندات MySQL يعمل DeClare فقط في بداية بداية ... كتلة النهاية كما هو الحال في برنامج مخزن.

لا تحتاج إلى إعلان متغير في MySQL. يتم تحديد نوع المتغير تلقائيًا عند تعيين قيمة. يمكن أن يكون نوعه واحدًا من: عدد صحيح أو عشري أو عائم أو سلسلة ثنائية أو غير مبنية أو قيمة خالية. راجع وثائق المتغيرات المعرفة من قبل المستخدم لمزيد من المعلومات:

http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

يمكنك استخدام SELECT ... إلى تعيين أعمدة لمتغير:

http://dev.mysql.com/doc/refman/5.0/en/select-into-statement.html

مثال:

mysql> SELECT 1 INTO @var;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @var;
+------+
| @var |
+------+
| 1    |
+------+
1 row in set (0.00 sec)

تجدر الإشارة إلى أنه على الرغم من حقيقة أنك تستطيع SELECT INTO المتغيرات العالمية مثل:

SELECT ... INTO @XYZ ...

تستطيع ليس استعمال FETCH INTO المتغيرات العالمية مثل:

FETCH ... INTO @XYZ

يبدو أنه ليس حشرة. آمل أن يكون ذلك مفيدًا لشخص ما ...

أنا أستخدم الإصدار 6 (MySQL Workbench Community (GPL) لـ Windows الإصدار 6.0.9 Revision 11421 Build 1170) على Windows Vista. ليس لدي مشكلة في الخيارات التالية. ربما قاموا بإصلاحها لأن هؤلاء الرجال حصلوا على المشاكل قبل ثلاث سنوات.

/* first option */
SELECT ID 
INTO @myvar 
FROM party 
WHERE Type = 'individual';

-- get the result
select @myvar;

/* second option */
SELECT @myvar:=ID
FROM party
WHERE Type = 'individual';


/* third option. The same as SQL Server does */
SELECT @myvar = ID FROM party WHERE Type = 'individual';

كل الخيار أعلاه أعطني نتيجة صحيحة.

ربما تفوتك الرمز @ قبل قيمتك ، هكذا select 'test' INTO @myValue;

بالنسبة لأولئك الذين يعملون في مثل هذه القضايا في الوقت الحالي ، حاول فقط وضع الاسم المستعار على الطاولة ، وهذا يجب أن تكون الحيلة ، على سبيل المثال:

SELECT myvalue 
  INTO myvar 
  FROM mytable x
 WHERE x.anothervalue = 1;

عملت معي.

هتافات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top