মাইএসকিউএল ডেকলারে ভিতরে পরিবর্তনশীল নির্বাচন করুন সিনট্যাক্স ত্রুটির কারণ?


94

আমি একটি ভেরিয়েবলের মধ্যে একটি একক মান নির্বাচন করতে চাই। আমি অনুসরণ করার চেষ্টা করেছি:

DECLARE myvar INT(4);

- অবিলম্বে কিছু সিনট্যাক্স ত্রুটি প্রদান করে returns

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;

... যা ঠিক যেমন কাজ করা উচিত ঠিক তেমনই কাজ করেছে। তবে আমি যদি প্রতিটি ক্যোয়ারী একসাথে চালিয়ে যাই তবে আমি কেবল @vv নুল পাই।

উত্তর:


111

আমি এই একই সমস্যার মধ্যে দৌড়েছি, তবে আমি মনে করি যে আমি বিভ্রান্তির কারণ কী তা জানি। আপনি যদি মাইএসকিএল ক্যোয়ারী অ্যানালাইজার ব্যবহার করেন তবে আপনি এটি কেবল সূক্ষ্মভাবে করতে পারেন:

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

তবে, আপনি যদি একই প্রশ্নটি মাইএসকিএল ওয়ার্কবেঞ্চে রাখেন তবে এটি একটি সিনট্যাক্স ত্রুটি নিক্ষেপ করবে। আমি জানি না কেন তারা আলাদা হবে, তবে তারা। মাইএসকিউএল ওয়ার্কবেঞ্চে সমস্যাটি সমাধান করার জন্য, আপনি কোয়েরিটি আবার লিখতে পারেন:

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

6
আসলে এটি আকর্ষণীয়। প্রশ্নের সাথে একটি মাইএসকিউএল ওয়ার্কবেঞ্চ ট্যাগ যুক্ত করা হয়েছে - যাতে অন্যরা জানতে পারে যে এই সমস্যাটি মাইএসকিউএল ওয়ার্কবেঞ্চের সাথে সম্পর্কিত।
ম্যাট ব্যানার

4
আমি ফেডোরা 18 তে মাইএসকিউএল ওয়ার্কবেঞ্চ সংস্করণ 5.2.47 রেভ 10398 ব্যবহার করেছি এবং এটিতে এরকম সমস্যা নেই।
GoYun.Info

দ্বিতীয় সমাধানটি :=হ্রাস করা হবে। তাই ব্যবহার পছন্দ SELECT ... INTO!
মেলোম্যান

42

শেষ পর্যন্ত একটি সঞ্চিত প্রক্রিয়া ছিল আমার সমস্যার সমাধান। এখানে কী সাহায্য করেছে:

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

DELIMITER ;

call test ();

পরীক্ষার জন্য Thx ... আকর্ষণীয় মনে হচ্ছে। দুর্ভাগ্যক্রমে আমি শেষ বাক্যটি পাই না। আপনি একটি বা দুটি শব্দ ভুলে গেছেন?
ম্যাট ব্যানার

41

এই উত্তরগুলি খুব ভাল ভেরিয়েবলগুলি কভার করে না।

একটি সঞ্চিত পদ্ধতিতে ইনলাইন অ্যাসাইনমেন্টটি করার ফলে ফলাফলগুলি ALSO- এ ফলাফল পুনরায় সেটেটে ফেরত পাঠানো হয়। বিভ্রান্তিকর হতে পারে। নির্বাচন করুন ... একাধিক ভেরিয়েবলের সাথে সিনট্যাক্স লিখুন:

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

নির্বাচন অবশ্যই 1 টি সারি ফেরত পাঠাতে হবে, সুতরাং 1 টি সীমাবদ্ধ করুন, যদিও এটি সর্বদা প্রয়োজনীয় নয়।


আমি একই কাজ করার চেষ্টা করছিলাম, @ ছাড়া ভেরিয়েবলগুলিও আমার পক্ষে কাজ করেছিল। ধন্যবাদ
আনন্দ রকজ

4
হ্যাঁ, একটি সঞ্চিত পদ্ধতিতে ভেরিয়েবলগুলি @ দিয়ে শুরু করতে হবে না। তবে, সেভাবে প্রদর্শন করা সহজ।
গার গডফ্রে


15

প্রতি মাইএসকিউএল ডক্স একটি BEGIN শুধুমাত্র শুরুতে কাজ ডিক্লেয়ার ... একটি সংরক্ষিত প্রোগ্রামে যেমন END টি ব্লক।


'মাইএসকিএল নির্বাচন করুন অভ্যন্তরীণ প্রক্রিয়া'-এর জন্য গুগল করার পরে এবং এখানে এসে পৌঁছানোর পরে, শুরুতে ঘোষণা না করাই syntax error, missing ;আমার ত্রুটির কারণ হয়েছিল ।
মিগুয়েল পাইতো

12

আপনার মাইএসকিউএল-এ একটি ভেরিয়েবল ডিক্লার করার দরকার নেই। কোনও ভেরিয়েবলের ধরণটি যখন প্রথমে একটি মান নির্ধারিত হয় তখন স্বয়ংক্রিয়ভাবে নির্ধারিত হয়। এর প্রকারের মধ্যে একটি হতে পারে: পূর্ণসংখ্যা, দশমিক, ভাসমান পয়েন্ট, বাইনারি বা ননবাইনারি স্ট্রিং বা NULL মান। আরও তথ্যের জন্য ব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবল ডকুমেন্টেশন দেখুন:

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

কোনও চলকতে কলামগুলি বরাদ্দ করতে আপনি নির্বাচন ... INTO ব্যবহার করতে পারেন:

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)

4
হুম, একরকম আমি এখানে সমস্যায় পড়েছি .. নির্বাচন করুন 1 ইন @ @ বার; একটি সিনট্যাক্স ত্রুটিও প্রদান করে। তেমনটি করে: Mytable থেকে কিছুটা @var নির্বাচন করুন; সম্ভবত এটি DELIMITER সমস্যা?
ম্যাট ব্যানার

আপনি কোন ত্রুটি পাচ্ছেন? আপনি মাইএসকিউএল এর কোন সংস্করণ ব্যবহার করছেন?
মাইকে

ত্রুটি কোড: 1064. আপনার এসকিউএল সিনট্যাক্সে আপনার একটি ত্রুটি রয়েছে; ৩ ম লাইনে 'INTO @var' এর নিকটবর্তী সঠিক সিনট্যাক্সের জন্য আপনার মাইএসকিউএল সার্ভার সংস্করণের সাথে সামঞ্জস্যপূর্ণ ম্যানুয়ালটি পরীক্ষা করুন Version সংস্করণ = ৫.৫.১6
স্কট

4

এটি লক্ষণীয় যে আপনি SELECT INTOবিশ্বব্যাপী চলকগুলি যেমন করতে পারেন তা সত্ত্বেও :

SELECT ... INTO @XYZ ...

আপনি গ্লোবাল ভেরিয়েবলগুলি ব্যবহার করতে পারবেন নাFETCH INTO :

FETCH ... INTO @XYZ

দেখে মনে হচ্ছে এটি কোনও বাগ নয় । আমি আশা করি এটি কারও পক্ষে সহায়ক হবে ...


3

আমি উইন্ডোজ ভিস্টায় 6.0.9 রিভিশন 11421 বিল্ড 1170 এর জন্য উইন্ডোজ 6 সংস্করণ (মাইএসকিউএল ওয়ার্কবেঞ্চ সম্প্রদায় (জিপিএল) ব্যবহার করছি। নিম্নলিখিত বিকল্পগুলির সাথে আমার কোনও সমস্যা নেই। তিন বছর আগে এই ছেলেরা সমস্যা পেয়েছে বলে সম্ভবত তারা এটি ঠিক করেছেন fixed

/* 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';

উপরের সমস্ত অপশন আমাকে একটি সঠিক ফলাফল দেয়।


3

এই মুহুর্তে যারা এই মুহূর্তে চলছে তাদের জন্য, কেবল টেবিলের জন্য একটি নাম রাখার চেষ্টা করুন, এই কৌশলটি হওয়া উচিত, যেমন:

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

এটা আমার জন্য কাজ করেছে।

চিয়ার্স


1

আপনি নিজের মানটির আগে @ চিহ্নটি মিস করতে পারেন, যেমন select 'test' INTO @myValue;


এটি একটি সেশনের পরিবর্তনশীল, বিভিন্ন বিষয়
অ্যাডাম এফ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.