মাইএসকিউএল: @ পরিবর্তনশীল বনাম পরিবর্তনশীল। পার্থক্য কি?


500

অন্য একটি প্রশ্নে আমি একজন পোস্ট করে আমাকে বলেছিলাম যে এর মধ্যে পার্থক্য রয়েছে:

@variable

এবং:

variable

মাইএসকিউএলে তিনি আরও উল্লেখ করেছিলেন যে এমএসএসকিউএলের ব্যাচের সুযোগ এবং মাইএসকিউএলের সেশনের সুযোগ কীভাবে রয়েছে। কেউ কি আমার জন্য এটি বিশদভাবে বলতে পারেন?


1
আমি এমএসএসকিউএল-এর সাথে পরিচিত এবং তাই এই ধরনের প্রশ্ন জিজ্ঞাসা করার জন্য চিন্তা কখনই আমার উপরে আসে না। এখানে প্রদত্ত উত্তরগুলি আমাকে এমন কিছুতে আটকেছিল যা সম্পর্কে আমার কোনও আইডিইএ ছিল না !! Thx ..
কেন

উত্তর:


623

MySQLব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবলগুলির ধারণা রয়েছে ।

এগুলি আলগাভাবে টাইপ করা ভেরিয়েবলগুলি যা কোনও সেশনে কোথাও সূচনা হতে পারে এবং সেশন শেষ হওয়া পর্যন্ত তাদের মান বজায় রাখে।

এগুলি একটি @চিহ্ন সহ প্রেরেন্ট করা হয় :@var

আপনি এই ভেরিয়েবলটি একটি SETবিবৃতি দিয়ে বা একটি ক্যোয়ারির ভিতরে শুরু করতে পারেন :

SET @var = 1

SELECT @var2 := 2

আপনি যখন সঞ্চিত পদ্ধতিটি বিকাশ করেন MySQL, আপনি ইনপুট পরামিতিগুলি পাস করতে পারেন এবং স্থানীয় ভেরিয়েবলগুলি ঘোষণা করতে পারেন:

DELIMITER //

CREATE PROCEDURE prc_test (var INT)
BEGIN
    DECLARE  var2 INT;
    SET var2 = 1;
    SELECT  var2;
END;
//

DELIMITER ;

এই ভেরিয়েবলগুলি কোনও উপসর্গ দিয়ে চাপানো হয় না।

একটি পদ্ধতি ভেরিয়েবল এবং একটি সেশন-নির্দিষ্ট ব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবলের মধ্যে পার্থক্য হ'ল পদ্ধতিটি পরিবর্তনশীলটি NULLপ্রতিটি সময় প্রক্রিয়াটি বলা হয়, আবার সেশন-নির্দিষ্ট ভেরিয়েবলটি পুনরায় পুনঃনির্মাণ করা হয়:

CREATE PROCEDURE prc_test ()
BEGIN
    DECLARE var2 INT DEFAULT 1;
    SET var2 = var2 + 1;
    SET @var2 = @var2 + 1;
    SELECT  var2, @var2;
END;

SET @var2 = 1;

CALL prc_test();

var2  @var2
---   ---
2     2


CALL prc_test();

var2  @var2
---   ---
2     3


CALL prc_test();

var2  @var2
---   ---
2     4

যেমন আপনি দেখতে পাচ্ছেন, var2(পদ্ধতি পরিবর্তনশীল) প্রতিবার পদ্ধতিটি পুনঃনির্মাণ করা হয়, যখন @var2(সেশন-নির্দিষ্ট ভেরিয়েবল) হয় না।

(ব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবল ছাড়াও, মাইএসকিউএল এছাড়াও কিছু পূর্বনির্ধারিত "সিস্টেম ভেরিয়েবল", যেমন "গ্লোবাল ভেরিয়েবল" হতে পারে যা হয়েছে @@global.portবা "সেশন ভেরিয়েবল" যেমন @@session.sql_mode; এই "সেশন ভেরিয়েবল" সেশন-নির্দিষ্ট থেকে সম্পর্কহীন ব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবল।)


43
এছাড়াও লক্ষ করুন, এখানে বিশ্বব্যাপী চলক উপলব্ধ রয়েছে: SELECT @@version;উদাহরণস্বরূপ দেখুন । এটিও একটি কারণ, কেন ব্যবহার DELIMITER @@করা সত্যিই ভাল ধারণা নয়।
Mchl

13
এটি নতুনদের জন্য নতুন প্রশ্ন তোলে ... আপনার উদাহরণ হিসাবে "var = var" এবং "var: = var" এর মধ্যে কোনও পার্থক্য রয়েছে কি?
কনফিক

13
@ কনফিক: এখানে কেউ নেই।
কাসনোই

9
নতুনদের জন্য আরেকটি প্রশ্ন। @বনাম না ব্যবহার করার জন্য কখন এটি সুপারিশ করা হয় ?
পিক্সেলফ্রিয়াক

73
@ কনফিক, @ কোসনোই: :=এবং এর মধ্যে একটি উল্লেখযোগ্য পার্থক্য রয়েছে এবং =তা হ'ল :=সর্বত্র একটি চলক-অ্যাসাইনমেন্ট অপারেটর হিসাবে কাজ করে, যখন =কেবল SETবিবৃতিতে সেভাবে কাজ করে , এবং অন্য কোথাও একটি তুলনামূলক অপারেটর। সুতরাং SELECT @var = 1 + 1;@var অপরিবর্তিত রেখে একটি বুলিয়ান (@ বায়ারের বর্তমান মানের উপর নির্ভর করে 1 বা 0) SELECT @var := 1 + 1;ফিরিয়ে দেবে , যখন @var 2-এ পরিবর্তিত হবে এবং 2-এ ফিরে আসবে
দেউই মরগান

71

মাইএসকিউএল -তে@variable কোনও ব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবল নির্দেশ করে । আপনি আপনার নিজের সংজ্ঞা দিতে পারেন।

SET @a = 'test';
SELECT @a;

সঞ্চিত প্রোগ্রামগুলির বাইরে, একটি variable, ব্যতীত @একটি সিস্টেম ভেরিয়েবল , যা আপনি নিজের সংজ্ঞা দিতে পারবেন না।

এই ভেরিয়েবলের সুযোগটি পুরো সেশন। এর অর্থ হ'ল ডাটাবেসটির সাথে আপনার সংযোগ বিদ্যমান থাকলেও চলকটি এখনও ব্যবহার করা যেতে পারে।

এটি এমএসএসকিউএলের বিপরীতে, যেখানে চলকটি কেবলমাত্র বর্তমান ব্যাচের প্রশ্নের (সঞ্চিত পদ্ধতি, স্ক্রিপ্ট বা অন্যথায়) উপলব্ধ থাকবে। এটি একই সেশনে ভিন্ন ব্যাচে উপলব্ধ হবে না।


2
সেশন ভেরিয়েবলগুলির সাথে বিভ্রান্ত হবেন না, যা শর্টহ্যান্ড SET @@a = 'test';, সিএফ আছে have dev.mysql.com/doc/refman/5.1/en/set-statement.html
রবএম

@ রবএম, এগুলিকে সিস্টেম ভেরিয়েবল বলা হয়, সেশন ভেরিয়েবল নয়।
পেসারিয়ার 10

1
@ পেসার: আমি কি ডক্সটি ভুল পড়ছি? "" "ভেরিয়েবলটি একটি সেশন ভেরিয়েবলের স্পষ্টরূপে নির্দেশ করতে, SESSION, @@ অধিবেশন বা @@
রবএম

5
@ রবএম, আপনি এটি ভুলভাবে পড়ছেন। বুলেট পয়েন্টের মধ্যে কেবল অনুচ্ছেদে নয়, পুরো অনুচ্ছেদটি পড়ুন। সহজ কথায়, দুটি ধরণের সেশন ভেরিয়েবল রয়েছে: 1) ব্যবহারকারী-সংজ্ঞায়িত সেশন ভেরিয়েবল এবং 2) সিস্টেম -নির্ধারিত  সেশন ভেরিয়েবলগুলি। আপনি ব্যবহার করে কোনও ব্যবহারকারী-সংজ্ঞায়িত সেশন ভেরিয়েবল সেট করতে পারবেন না @@। উদাহরণস্বরূপ, set@@my_var=1, set@@session.my_var=1, এবং set session my_var=1কারণ কাজ করবে না my_varএকটি নয় সিস্টেমের পরিবর্তনশীল, যেহেতু আমরা কি করতে পারি set@@big_tables=1, set@@session.big_tables=1এবং set session big_tables=1কারণ big_tablesএকটি সিস্টেম পরিবর্তনশীল।
পেসারিয়ার

1
@ গোবিন্দরাই: কাসনোইয়ের উত্তরে, var2একটি @উপসর্গ ছাড়াই পরিবর্তনশীল , তবে এটি কোনও সিস্টেমের পরিবর্তনশীল নয়: এটি একটি পদ্ধতি পরিবর্তনশীল। এটি অনুমোদিত হয় কারণ এটি একটি সঞ্চিত পদ্ধতিতে রয়েছে (ওরফে সঞ্চিত প্রোগ্রাম)। সঞ্চিত পদ্ধতির বাইরেও একটি ভেরিয়েবল @সিস্টেম ভেরিয়েবল।
LarsH

10

এমএসএসকিউএলএর প্রয়োজন হয় যে পদ্ধতিগুলির মধ্যে চলকগুলি ডিক্যারেড করা উচিত এবং লোকেরা @ পরিবর্তনশীল সিনট্যাক্স (ডিক্লার @ টেক্সট ভর্চার (25) = 'পাঠ্য') ব্যবহার করুন use এছাড়াও, মাইক্রোসফ্ট মাইএসকিউএল এর বিপরীতে পদ্ধতিটিতে যে কোনও ব্লকের মধ্যে ঘোষণার অনুমতি দেয় যা শীর্ষে সমস্ত ডিক্লেয়ার প্রয়োজন।

কমান্ড লাইনে ভাল থাকাকালীন, আমি মাইএসকিউএল মধ্যে সঞ্চিত পদ্ধতিতে "সেট = @ পরিবর্তনশীল" ব্যবহার করা ঝুঁকিপূর্ণ বলে মনে করি। কোনও সুযোগ নেই এবং ভেরিয়েবলগুলি স্কোপ সীমানা জুড়ে লাইভ। এটি জাভাস্ক্রিপ্টের ভেরিয়েবলগুলির অনুরূপ "ভার" উপসর্গ ব্যতীত ঘোষিত হয়েছে, যা তখন বিশ্বব্যাপী নেমস্পেস এবং অপ্রত্যাশিত সংঘর্ষ ও ওভাররাইট তৈরি করে।

আমি আশা করছি যে মাইএসকিউএলের ভাল লোকেরা একটি সঞ্চিত পদ্ধতিতে বিভিন্ন ব্লক স্তরে @ পরিবর্তনশীল ডিক্লেয়ার করতে অনুমতি দেবে। @ (সাইন ইন) লক্ষ্য করুন। @ সাইন উপসর্গটি টেবিল কলামের নামগুলি থেকে পরিবর্তনশীল নামগুলি পৃথক করতে সহায়তা করে - কারণ তারা প্রায়শই একই থাকে। অবশ্যই, কেউ সর্বদা একটি "ভি" বা "এল_" উপসর্গ যুক্ত করতে পারে তবে @ চিহ্নটি পরিবর্তনশীল নামটি কলামের সাথে মিলিয়ে দেওয়ার জন্য একটি সহজ এবং সংক্ষিপ্ত উপায় যা আপনি ক্লোবার্বিং না করেই ডেটা উত্তোলন করতে পারেন।

মাইএসকিউএল সঞ্চিত পদ্ধতিতে নতুন এবং তারা তাদের প্রথম সংস্করণে ভাল কাজ করেছে। তারা এখানে এটিকে কোথায় রূপ দেয় তা দেখার এবং ভাষার পরিপক্ক ভাষার সার্ভারের দিকগুলি দেখার জন্য এটি একটি আবেদন হবে।


3

নীতিগতভাবে, আমি সঞ্চিত পদ্ধতিতে ব্যবহারকারীর সংজ্ঞায়িত ভেরিয়েবলগুলি (@ সহ প্রিপেন্ড করা) ব্যবহার করি। এটি জীবনকে আরও সহজ করে তোলে, বিশেষত যখন আমার দুটি বা ততোধিক সঞ্চিত পদ্ধতিতে এই পরিবর্তনশীলগুলির প্রয়োজন হয়। আমি যখন কেবলমাত্র একটি সিস্টেমের পরিবর্তনশীল (প্রিপেন্ডড @ ছাড়াই) ব্যবহার করি তার চেয়ে আমার কেবলমাত্র একটি স্টোরড পদ্ধতিতে একটি পরিবর্তনশীল প্রয়োজন।

@ জাইবো: স্টোরডপ্রেসেসচারগুলিতে @ ভেরিয়েবলগুলি ব্যবহার করা কেন ঝুঁকিপূর্ণ তা আমি বুঝতে পারি না। আপনি কি দয়া করে "সুযোগ" এবং "সীমানা" কিছুটা সহজ (আমার জন্য নতুন হিসাবে) ব্যাখ্যা করতে পারবেন?


3
এটি মৌলিক সফ্টওয়্যার ইঞ্জিনিয়ারিং নীতি লঙ্ঘন করে। সুযোগ কী তা অবধি ঠিক না হওয়া পর্যন্ত দয়া করে কোড অ্যান্থার লাইনটি লিখবেন না এবং কেন বিশ্বব্যাপী ভেরিয়েবলগুলি ব্যবহার করা সাধারণত একটি ভয়ংকর ধারণা। যখন আমি ১০১ টি প্রোগ্রামিং ক্লাস নিয়েছি, কারণ আমার মনে আছে যে কোনও কিছুর জন্য একটি গ্লোবাল ব্যবহার করার ফলে একটি স্বয়ংক্রিয় "এফ" তৈরি হবে। বিশেষ ব্যতিক্রম রয়েছে, তবে সাধারণ নিয়ম হিসাবে - কেবল এটি করবেন না!
বুভিনভিন

কেন? - প্রতিটি মাইএসকিউএল-বইতে @ ভেরিয়েবলগুলি একেবারে সাধারণ।
পিটার

অবশ্যই, কোনও "ফ্ল্যাট" স্ক্রিপ্টে কোনও ফাংশন কল, প্রক্রিয়া, ট্রিগার ইত্যাদি নেই এবং যদি আপনি কেবল সেই সাধারণ স্ক্রিপ্ট, বা একটি সীমিত কমান্ডের সীমাবদ্ধ করতে চলেছেন এবং সেশনটি শেষ করবেন (এর ফলে আপনার গ্লোবালগুলি ধ্বংস করা হবে) ying এটি সেক্ষেত্রে এগিয়ে যান এবং আপনি চাইলে সেগুলি ব্যবহার করুন। তবে এগুলি কোনও ফাংশনের ভিতরে ব্যবহার করবেন না! আপনি যদি কেবল গুগল গ্লোবাল ভেরিয়েবল বা স্কোপ করেন তবে আপনি তাত্ক্ষণিকভাবে এই ধারণাটির জন্য বিস্তৃত সমর্থন পাবেন যে সেগুলি সর্বজনীনভাবে নষ্ট করা হয়েছে। এখানে একটি শুরুর স্থান আছে: wiki.c2.com/?GlobalVariablesAreBad : অথবা একটি সাধারণ ব্যাখ্যা জন্য en.wikipedia.org/wiki/Global_variable
BuvinJ

2
মাইএসকিউএলে, @ পরিবর্তনশীলগুলি বিশ্বব্যাপী। এটি সহজেই নিশ্চিত হয়ে যায়। কোনও ফাংশনের বাইরে একটি সেট করুন এবং তারপরে এটির মধ্যে একটিটির মূল্যায়ন করুন। বিপরীতভাবে, একটি ফাংশনটির ভিতরে একটি সেট করুন এবং এটির বাইরে এটি মূল্যায়ন করুন। আপনি দেখতে পাবেন যে ফাংশনটি এরকম সুযোগকে রক্ষা করে না। তারা একে অপরের পায়ের আঙ্গুলের উপর পা রেখে।
বুভিন জে

1
মাইএসকিউএল পরিভাষা ব্যবহার করে, @@GLOBALভেরিয়েবলগুলি আরও "গ্লোবাল" এবং कपटी। তারা সেশন পার! @variables"সেশন স্কোপ" আছে, তাই কমপক্ষে তারা সেভাবেই সীমাবদ্ধ থাকে। যে কোনও সাধারণ ভাষায় যাকে আপনি "গ্লোবাল" স্কোপ বলছেন (তবে যখন তারা ফাংশনগুলি অতিক্রম করে)। "গ্লোবাল" মাইএসকিউএল ধারণাটিকে সম্ভবত "সর্বজনীন" বলা উচিত, এটি এটি চলমান প্রক্রিয়ার সীমানার বাইরেও প্রসারিত করে। একটি "গ্লোবাল" সাধারণত স্ট্যান্ডার্ড ভাষায় এটি করতে পারে না, কারণ প্রক্রিয়াগুলি মেমরির স্থান ভাগ করে না। এটি এসকিউএল এর অবিচ্ছিন্ন (বনাম অস্থির) প্রবণতা থেকে উদ্ভূত।
বুভিনভিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.