development

MySQL : @ 변수와 변수

big-blog 2020. 2. 13. 00:47
반응형

MySQL : @ 변수와 변수 차이점이 뭐야?


다른 질문에 누군가가 게시 한 내용에 따르면 다음과 같은 차이점이 있습니다.

@variable

과:

variable

MySQL에서. 또한 MSSQL에 배치 범위가 있고 MySQL에 세션 범위가있는 방법에 대해서도 언급했습니다. 누군가 나를 위해 이것을 자세히 설명 할 수 있습니까?


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"를 조금 더 쉽게 설명해 주시겠습니까?

참고 URL : https://stackoverflow.com/questions/1009954/mysql-variable-vs-variable-whats-the-difference



반응형