Bir başka soruda, birisi arasında bana bir fark olduğunu söylediğini gönderdim:
@variable
ve:
variable
MySQL. Ayrıca MSSQL'in toplu kapsamı ve MySQL'in oturum kapsamı olduğunu belirtti. Birisi benim için bu konuyu açıklayabilir mi?
Bir başka soruda, birisi arasında bana bir fark olduğunu söylediğini gönderdim:
@variable
ve:
variable
MySQL. Ayrıca MSSQL'in toplu kapsamı ve MySQL'in oturum kapsamı olduğunu belirtti. Birisi benim için bu konuyu açıklayabilir mi?
Yanıtlar:
MySQL
kullanıcı tanımlı değişkenler kavramına sahiptir .
Bunlar, oturumun herhangi bir yerinde başlatılabilecek ve oturum sona erene kadar değerlerini koruyabilecek gevşek yazılan değişkenlerdir.
Bu gibi bir @
işaret ile eklenirler :@var
Bu değişkeni SET
bir sorguda veya bir sorguda içeride başlatabilirsiniz :
SET @var = 1
SELECT @var2 := 2
Bir saklı yordam geliştirdiğinizde MySQL
, giriş parametrelerini iletebilir ve yerel değişkenleri bildirebilirsiniz:
DELIMITER //
CREATE PROCEDURE prc_test (var INT)
BEGIN
DECLARE var2 INT;
SET var2 = 1;
SELECT var2;
END;
//
DELIMITER ;
Bu değişkenlere herhangi bir önek eklenmez.
Bir yordam değişkeni ile oturuma özgü bir kullanıcı tanımlı değişken arasındaki fark, yordam değişkeninin NULL
yordam her çağrıldığında yeniden başlatılmasıdır, oysa oturuma özgü değişken değildir:
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
Gördüğünüz gibi var2
, prosedür her çağrıldığında (yordam değişkeni) yeniden başlatılırken @var2
(oturuma özgü değişken) başlatılmaz .
(Kullanıcı tanımlı değişkenlere ek olarak, MySQL'in önceden tanımlanmış bazı "sistem değişkenleri" de vardır; bunlar "global değişkenler" gibi @@global.port
veya "oturum değişkenleri" gibi @@session.sql_mode
; bu "oturum değişkenleri", oturuma özgü kullanıcı tanımlı değildir değişkenler.)
SELECT @@version;
Örneğin, bkz . Bu da kullanmanın neden DELIMITER @@
iyi bir fikir olmadığının bir nedenidir .
@
Vs not kullanılması ne zaman önerilir ?
:=
ve arasında önemli bir fark vardır =
ve bu :=
her yerde değişken atama operatörü olarak =
çalışır , ancak SET
ifadelerde bu şekilde çalışır ve başka her yerde bir karşılaştırma operatörüdür. Yani SELECT @var = 1 + 1;
değişmeden @var ayrılıp ederken, (@ VAR şimdiki değerine bağlı olarak 1 veya 0) bir boolean dönecektir SELECT @var := 1 + 1;
2'ye @var değişecek ve 2. return
MySQL'de, @variable
kullanıcı tanımlı bir değişkeni belirtir . Kendinizi tanımlayabilirsiniz.
SET @a = 'test';
SELECT @a;
Depolanan programların dışında, a variable
, olmadan @
, kendinizi tanımlayamayacağınız bir sistem değişkenidir .
Bu değişkenin kapsamı tüm oturumdur. Bu, veritabanıyla bağlantınız varken değişkenin hala kullanılabileceği anlamına gelir.
Bu, değişkenin yalnızca geçerli sorgu kümesinde (saklı yordam, komut dosyası veya başka bir şekilde) kullanılabileceği MSSQL'in tersidir. Aynı oturumda farklı bir grupta kullanılamaz.
SET @@a = 'test';
, bkz. dev.mysql.com/doc/refman/5.1/en/set-statement.html
@@
. Örneğin, set@@my_var=1
, set@@session.my_var=1
, ve set session my_var=1
çünkü işe yaramaz my_var
bir değil sistem Yapabileceğimiz oysa değişken set@@big_tables=1
, set@@session.big_tables=1
ve set session big_tables=1
çünkübig_tables
bir sistem değişkendir.
var2
olmayan bir değişkendir @
, ancak bir sistem değişkeni değildir: bir işlem değişkeni. Saklı yordamda (saklı program olarak da bilinir) buna izin verilir. Saklı yordamlar dışında bir değişken @
, bir sistem değişkenidir.
MSSQL, yordamlar içindeki değişkenlerin DECLAREd olmasını ve milletlerin @Variable sözdizimini kullanmasını gerektirir (DECLARE @TEXT VARCHAR (25) = 'text'). Ayrıca MS, üstteki tüm DECLARE'ları gerektiren mySQL'in aksine, yordamdaki herhangi bir blok içinde bildirimlere izin verir.
Komut satırında iyi olsa da, mySQL saklı yordamlar içinde "set = @variable" kullanarak riskli hissediyorum. Kapsam sınırları boyunca hiçbir kapsam ve değişken yaşamaz. Bu, JavaScript'te "var" öneki olmadan bildirilen değişkenlere benzer; bunlar daha sonra genel ad alanıdır ve beklenmedik çarpışmalar ve üzerine yazmalar oluşturur.
MySQL iyi millet bir saklı yordam içinde çeşitli blok düzeylerinde DECLARE @Variable izin verir umuyoruz. @ İşaretine dikkat edin. @ Sign öneki, değişken adlarını tablo sütun adlarından ayırmaya yardımcı olur - genellikle aynıdır. Tabii ki, her zaman bir "v" veya "l_" öneki eklenebilir, ancak @ işareti, değişken adının verileri tıkamadan ayıklayabileceğiniz sütunla eşleşmesinin kullanışlı ve kısa bir yoludur.
MySQL, saklı yordamlar için yenidir ve ilk sürümleri için iyi bir iş çıkarmışlardır. Burada nereden aldıklarını görmek ve dilin sunucu tarafı özelliklerini olgunlaştırmak bir zevk olacaktır.
Prensip olarak, Saklı Yordamlar içinde UserDefinedVariables (@ ile ekli) kullanıyorum. Bu, özellikle iki veya daha fazla Saklı Yordamda bu değişkenlere ihtiyaç duyduğumda hayatı kolaylaştırır. Sadece TEK Saklı Yordam içinde bir değişkene ihtiyaç duyduğumda, bir Sistem Değişkeni kullanıyorum (@ ekli olmadan).
@Xybo: StoredProcedures'ta @variables kullanmanın neden riskli olması gerektiğini anlamıyorum. "Kapsam" ve "sınırları" biraz daha kolay açıklayabilir misiniz (benim için yeni başlayanlar gibi)?
@@GLOBAL
değişkenler daha "global" ve sinsidir. Oturumları geçiyorlar! @variables
"oturum kapsamı" var, en azından onlar bu şekilde kapalı kalırlar. Ancak "global" kapsam dediğiniz herhangi bir normal dilde (işlevler arası vb. Olduğunda). MySQL "küresel" kavramı belki de "evrensel" olarak adlandırılmalıdır, çünkü onu çalıştıran sürecin sınırlarının ötesine uzanır. "Global" normalde bunu standart bir dilde yapamaz, çünkü süreçler bellek alanını paylaşmaz. Bu, SQL'in (uçucuya karşı) kalıcı eğiliminden kaynaklanır.