다른 질문에 누군가가 게시 한 내용은 다음과 같은 차이점이 있습니다.
@variable
과:
variable
MySQL에서. 또한 MSSQL에 배치 범위가 있고 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
(세션 별 변수)는 초기화 되지 않습니다.
(MySQL 에는 사용자 정의 변수 외에도 미리 정의 된 “시스템 변수”가 있습니다 . 이러한 ” 시스템 변수”는 “글로벌 변수”와 같은 @@global.port
“세션 변수”와 같을 수 있습니다 @@session.sql_mode
. 이러한 “세션 변수”는 세션 별 사용자 정의와 관련이 없습니다. 변수.)
답변
MySQL에서는 사용자 정의 변수를@variable
나타냅니다 . 자신을 정의 할 수 있습니다.
SET @a = 'test';
SELECT @a;
저장된 프로그램 외부에서 variable
, without @
는 시스템 변수 이므로 직접 정의 할 수 없습니다.
이 변수의 범위는 전체 세션입니다. 이는 데이터베이스와의 연결이 존재하는 동안 변수를 계속 사용할 수 있음을 의미합니다.
이는 MSSQL과 달리 현재 쿼리 배치 (저장 프로 시저, 스크립트 또는 기타)에서만 변수를 사용할 수 있습니다. 동일한 세션에서 다른 배치로 사용할 수 없습니다.
답변
MSSQL은 프로 시저 내의 변수가 DECLAREd이어야하고 사람들은 @Variable 구문 (DECLARE @TEXT VARCHAR (25) = ‘text’)을 사용해야합니다. 또한 MS는 맨 위에 모든 DECLARE가 필요한 mySQL과 달리 프로 시저의 모든 블록 내에서 선언을 허용합니다.
커맨드 라인에는 좋지만 mySQL의 저장 프로 시저 내에서 “set = @variable”을 사용하는 것이 위험하다고 생각합니다. 범위와 변수는 범위 경계에 없습니다. 이는 “var”접두사없이 선언 된 JavaScript의 변수와 유사합니다.이 변수는 전역 네임 스페이스이며 예기치 않은 충돌 및 덮어 쓰기를 생성합니다.
mySQL의 좋은 사람들이 DECLARE @Variable을 저장 프로 시저 내의 다양한 블록 수준에서 사용할 수 있기를 바랍니다. @ (기호)를 확인하십시오. @ 기호 접두사는 변수 이름을 테이블 열 이름과 구분하는 데 도움이됩니다. 물론, 항상 “v”또는 “l_”접두어를 추가 할 수 있지만 @ 기호는 변수 이름을 데이터를 추출하지 않고 열을 일치시키는 편리한 방법으로 간결한 방법입니다.
MySQL은 저장 프로 시저에 익숙하지 않으며 첫 번째 버전에서 훌륭한 작업을 수행했습니다. 그들이 어디에서 그것을 사용 하는지를보고 언어의 서버 측 측면이 성숙 해지는 것을 보는 것은 즐거움이 될 것입니다.
답변
원칙적으로 저장 프로 시저 내에서 UserDefinedVariables (@ 앞에 추가)를 사용합니다. 이것은 특히 두 개 이상의 저장 프로 시저에서 이러한 변수가 필요할 때 삶을 더 쉽게 만듭니다. ONE 저장 프로 시저 내에서만 변수가 필요한 경우 시스템 변수를 사용하는 것 (앞에 @없이)을 사용하십시오.
@ Xybo : StoredProcedures에서 @variables를 사용하는 것이 위험한 이유를 이해하지 못합니다. “scope”와 “boundaries”를 조금 더 쉽게 설명해 주시겠습니까?