حدد في متغير في MySQL DECLARE يسبب خطأ بناء الجملة؟
-
28-09-2019 - |
سؤال
أود تحديد قيمة واحدة في متغير. حاولت المتابعة:
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;
عملت معي.
هتافات.