Dalam pertanyaan lain saya memposting seseorang mengatakan kepada saya bahwa ada perbedaan antara:
@variable
dan:
variable
di MySQL. Dia juga menyebutkan bagaimana MSSQL memiliki lingkup batch dan MySQL memiliki ruang lingkup sesi. Bisakah seseorang menjelaskan hal ini untuk saya?
Jawaban:
MySQL
memiliki konsep variabel yang ditentukan pengguna .Mereka adalah variabel yang diketik secara longgar yang dapat diinisialisasi di suatu tempat dalam suatu sesi dan mempertahankan nilainya sampai sesi berakhir.
Mereka diawali dengan
@
tanda, seperti ini:@var
Anda dapat menginisialisasi variabel ini dengan
SET
pernyataan atau di dalam kueri:Saat Anda mengembangkan prosedur tersimpan
MySQL
, Anda dapat meneruskan parameter input dan mendeklarasikan variabel lokal:Variabel-variabel ini tidak diawali dengan awalan.
Perbedaan antara variabel prosedur dan variabel yang ditentukan pengguna khusus sesi adalah variabel prosedur diinisialisasi ulang untuk
NULL
setiap kali prosedur dipanggil, sedangkan variabel khusus sesi tidak:Seperti yang Anda lihat,
var2
(variabel prosedur) diinisialisasi ulang setiap kali prosedur dipanggil, sementara@var2
(variabel khusus sesi) tidak.(Selain variabel yang ditentukan pengguna, MySQL juga memiliki beberapa "variabel sistem" yang telah ditentukan, yang mungkin "variabel global" seperti
@@global.port
atau "variabel sesi" seperti@@session.sql_mode
; "variabel sesi" ini tidak terkait dengan sesi yang ditentukan pengguna yang ditentukan pengguna variabel.)sumber
SELECT @@version;
misalnya. Ini juga alasan, mengapa menggunakanDELIMITER @@
bukanlah ide yang bagus.@
vs tidak?:=
dan=
, dan itu:=
berfungsi sebagai operator penugasan variabel di mana saja, sementara=
hanya bekerja seperti itu dalamSET
pernyataan, dan merupakan operator perbandingan di mana pun. JadiSELECT @var = 1 + 1;
akan meninggalkan @var tidak berubah dan mengembalikan boolean (1 atau 0 tergantung pada nilai saat ini dari @var), sementaraSELECT @var := 1 + 1;
akan mengubah @var ke 2, dan mengembalikan 2.Di MySQL,
@variable
menunjukkan variabel yang ditentukan pengguna . Anda bisa menentukan sendiri.Di luar program yang disimpan, a
variable
, tanpa@
, adalah variabel sistem , yang tidak dapat Anda tentukan sendiri.Cakupan variabel ini adalah seluruh sesi. Itu berarti bahwa sementara koneksi Anda dengan database ada, variabel masih dapat digunakan.
Ini berbeda dengan MSSQL, di mana variabel hanya akan tersedia dalam kumpulan kueri saat ini (prosedur tersimpan, skrip, atau sebaliknya). Itu tidak akan tersedia dalam batch yang berbeda di sesi yang sama.
sumber
SET @@a = 'test';
, lih. dev.mysql.com/doc/refman/5.1/en/set-statement.html@@
. Sebagai contoh,set@@my_var=1
,set@@session.my_var=1
, danset session my_var=1
tidak akan bekerja karenamy_var
bukan sistem variabel, sedangkan kita bisa melakukanset@@big_tables=1
,set@@session.big_tables=1
danset session big_tables=1
karenabig_tables
merupakan variabel sistem.var2
adalah variabel tanpa@
awalan, tetapi itu bukan variabel sistem: itu adalah variabel prosedur. Ini diperbolehkan karena itu dalam prosedur tersimpan (alias program tersimpan). Di luar prosedur tersimpan, variabel tanpa@
adalah variabel sistem.MSSQL mensyaratkan bahwa variabel dalam prosedur menjadi DECLAREd dan orang-orang menggunakan sintaks @Variable (DECLARE @TEXT VARCHAR (25) = 'teks'). Juga, MS memungkinkan untuk mendeklarasikan dalam blok apa pun dalam prosedur, tidak seperti mySQL yang membutuhkan semua DECLARE di bagian atas.
Meskipun bagus di baris perintah, saya merasa menggunakan "set = @variable" di dalam prosedur tersimpan di mySQL berisiko. Tidak ada ruang lingkup dan variabel hidup melintasi batas ruang lingkup. Ini mirip dengan variabel dalam JavaScript yang dideklarasikan tanpa awalan "var", yang kemudian menjadi namespace global dan membuat tabrakan dan menimpa yang tidak terduga.
Saya berharap orang-orang baik di mySQL akan memungkinkan DECLARE @Variable di berbagai level blok dalam prosedur tersimpan. Perhatikan @ (pada tanda). Awalan tanda @ membantu memisahkan nama variabel dari nama kolom tabel - karena sering sama. Tentu saja, seseorang selalu dapat menambahkan awalan "v" atau "l_", tetapi tanda @ adalah cara yang praktis dan ringkas untuk memiliki nama variabel yang cocok dengan kolom tempat Anda mengekstraksi data dari tanpa mengkliknya.
MySQL baru untuk prosedur tersimpan dan mereka telah melakukan pekerjaan dengan baik untuk versi pertama mereka. Akan menyenangkan untuk melihat di mana mereka mengambilnya di sini dan untuk menonton aspek sisi server dari bahasa matang.
sumber
Pada prinsipnya, saya menggunakan UserDefinedVariables (diawali dengan @) dalam Stored Procedures. Ini membuat hidup lebih mudah, terutama ketika saya membutuhkan variabel-variabel ini dalam dua atau lebih Prosedur Tersimpan. Hanya ketika saya membutuhkan variabel hanya dalam SATU Prosedur Tersimpan, daripada saya menggunakan System Variable (tanpa prepended @).
@Xybo: Saya tidak mengerti mengapa menggunakan @variables di StoredProcedures harus berisiko. Bisakah Anda jelaskan "ruang lingkup" dan "batas" sedikit lebih mudah (bagi saya sebagai newbe)?
sumber
@@GLOBAL
variabel bahkan lebih "global" dan berbahaya. Mereka melewati sesi!@variables
memiliki "ruang lingkup sesi", jadi setidaknya mereka tetap terkurung dengan cara itu. Namun, dalam bahasa normal apa pun yang Anda sebut ruang lingkup "global" (ketika fungsi tersebut melintas dll). Konsep MySQL "global" mungkin harus disebut "universal", karena ia melampaui batas proses yang menjalankannya. "Global" biasanya tidak bisa melakukan itu dalam bahasa standar, karena proses tidak berbagi ruang memori. Ini berasal dari kecenderungan SQL yang persisten (volatile).