Mysql&DBeaver

DBeaver)procedure에서 많이 쓰는 변수 문법

연습노트 2024. 9. 8. 17:46

자료를 잠깐 저장하고 싶으면 변수를 만들어서 사용합니다.

변수는 숫자, 문자 등의 간단한 자료를 잠깐 저장해두는 통입니다. 

만들어서 사용해봅시다. 

 

 

 

 

변수 문법

 

변수는 길고 복잡한 자료를 잠깐 보관하는 통일 뿐인데 

SET 키워드 이용해서 만들면 됩니다. 

 

 

SET @age = 20;
SELECT @age := 20;

SET @변수명 = 저장할값; 문법 쓰면 됩니다. 

SET @변수명 := 저장할값; 써도 같은 뜻입니다.  

SELECT @변수명 := 저장할값; 써도 같은 뜻입니다.

셋 중 하나 쓰십쇼 

그래서 위처럼 작성하면 age 라는 변수명에 20이라는 값이 저장됩니다. 

 

 

 

 

SET @age = 20;
SELECT @age;

그럼 앞으로 @변수명이라고 쓸 때마다 그 자리에 저장해뒀던 자료가 남습니다.

그래서 위처럼 작성하면 20이 출력되겠군요.

 

 

 

 

SET @price = 6000;
SELECT * FROM product WHERE 가격 = @price;

이럼 무슨뜻이게요?

가격이 6000인 상품만 가져오라는 뜻이 되겠군요. 

 

 

 

 

SET @price = (SELECT COUNT(*) FROM product WHERE 가격 = 5000) 

당연히 문자나 숫자들어갈 곳엔 서브쿼리넣어도 상관없습니다. 

 

 

 

 

SET @age =  20;
SET @age = @age + 1;
SELECT @age;

기존 변수에 값을 수정할 때 '값 변경'이 아니라 '값 추가'만 하고 싶으면

SET 변수 = 변수  + 1 하면 됩니다. 

 

 

 

 

 

Q. procedure와 비슷한데요?

A. 그건 여러 SQL 문장을 저장할 때 쓰면 되고 

@변수에는 숫자, 문자, binary, NULL 이런 자료 1개만 간단하게 저장할 수 있습니다. 

그럴 때 씁시다. 

 

 

 

 

 

 

procedure 안에서 변수만들어쓰기

 

procedure 안에선 DECLARE 키워드로 변수를 생성하는 경우가 많습니다. 

 

CREATE PROCEDURE mart.var_test() 
BEGIN 
  DECLARE 변수1 INT;
  DECLARE 변수2 VARCHAR(100);
  DECLARE 변수3 INT DEFAULT 123;
END 

 

1. DECLARE 변수명 데이터타입;

이렇게 적으면 변수를 만들 수 있습니다. 여기는 변수명에 @ 안써도 됩니다.

2. 다만 BEGIN 바로 밑에 넣어야합니다. 안그러면 에러날걸요 

3. DEFAULT 어쩌구는 변수만들 때 초기값을 넣어주는 부분입니다. 선택사항임 

4. DECLARE 로 만든 변수에 데이터 저장시엔 똑같이 SET 키워드로 변수에 마음대로 데이터 저장가능합니다. 

 

 

 

 

CREATE PROCEDURE mart.var_test() 
BEGIN 
  DECLARE 변수1 INT;
  SET 변수1 = 10;
  SET 변수1 = 변수1 + 1;
  SELECT 변수1;
END 

- 변수에 데이터를 새로 집어넣고싶으면 SET 문법이용하면 됩니다. 

- 변수 기존값에 1만 더해주고 싶으면 변수 = 변수 + 1 이렇게 쓰면 됩니다.

그럼 위 코드는 뭐가 출력될까요? 

 

 

 

 

 

 

DECLARE 변수 vs @변수 차이점 

 

1. 변수를 사용할 수 있는 범위의 차이가 있습니다. 

@변수는 user variable 이라고 부르는데 

한 번 만들어놓으면 DBMS 프로그램 끌 때 까지 (연결 종료 까지) 남아있습니다.

그리고 작성하는 SQL 파일 모든 곳에서 전역으로 사용가능합니다.

그래서 가끔은 @변수를 똑같은 이름으로 중복선언하는 실수도 발생해서 사람들이 별로 안좋아합니다. 

 

반면 DECLARE 변수는 변수를 만든 procedure 안에서만 사용할 수 있습니다. 

그래서 마음대로 만들어도 안전합니다. 

믿을 수 없으니까 직접 실험해봅시다. 

 

 

 

2. 변수가 언제 사라지는지도 차이가 있습니다.

@변수는 DB연결 종료시 사라집니다. 

DECLARE 변수는 procedure 실행 종료시 바로 사라집니다. 

진짠지 확인하기 위해서 DECLARE 변수하나 만들고 그 밑에 10을 더하는 코드를 적어봅시다. 

 

 

DROP PROCEDURE IF EXISTS mart.var_test;

DELIMITER $$
CREATE PROCEDURE mart.var_test()
BEGIN
  DECLARE 나이 int DEFAULT 10;
  SET 나이 = 나이 + 10; 
  SELECT 나이;

END
$$ 
DELIMITER ;

CALL mart.var_test();
CALL mart.var_test();
CALL mart.var_test();

1. 나이라는 변수를 만들고 기본값은 10을 넣어놨습니다.

2. 그리고 변수에 10을 더합니다. 

3. 출력합니다. 

 

이렇게 만들어두면 var_test() 라는 procedure를 사용할 때 마다 항상 20이 출력됩니다.

왜냐면 procedure 끝나면 DECLARE 변수는 사라집니다.

procedure는 실행할 때 마다 DECLARE 변수는 리셋된다고 생각해도 됩니다. 

 

 

 

 

 

DROP PROCEDURE IF EXISTS mart.var_test;

DELIMITER $$
CREATE PROCEDURE mart.var_test()
BEGIN
  SET @나이 = @나이 + 10;
  SELECT 나이;

END
$$ 
DELIMITER ;

SET @나이 = 10;
CALL mart.var_test();
CALL mart.var_test();
CALL mart.var_test();

1. 근데 @나이 변수를 user variable로 바깥에 만들고

2. procedure 안에서 계속 10씩 더해서 출력해보면 

20 30 40 이런 식으로 출력됩니다. 

 

왜냐면 user variable을 한 번 만들면 접속종료 전까지 계속 남아있어서 그렇습니다. 

 

 

 

 

 

 

 

다른 DBMS에서는

 

Oracle, Postgres 둘 다 procedure 안에서만 DECLARE 키워드로 변수만들어서 쓰는 경우가 많습니다. 

MySQL의 이상한 @변수 그런거 없음 

 

오늘의 결론은 코드짜다가 너무 자주 쓰는 문자나 숫자자료를 발견하면

그걸 변수에 저장해두고 쓰면 편리할 수 있습니다. 

 

 

 

 

 

오늘의 숙제 : 

Q1. 여러분의 이름, 나이를 @변수로 각각 만들어서 저장하고 출력해보십시오.

답은

쉬워서 없음 ㅅㄱ

[collapse]

 

 

 

Q2. 방금 만든 2개의 변수를 함께 문자로 합쳐서 출력해봅시다.

(예시) 님 이름이 홍길동이고 나이가 20이라고 저장해놨으면 "홍길동 21" 이 출력되면 됩니다.  

당연히 모르는건 검색해서 해야지 생각한다고 나오지 않습니다.

보기전에 검색도 해보고 1시간 코드짜봤습니까?

 

SET @이름 = '홍길동';
SET @나이 = 10;
SELECT CONCAT(@이름, ' ', @나이 + 1) 

구글에 검색해보니 CONCAT 쓰라고하는군요.

 

[collapse]

 

 

 

 

Q3. 여러분의 이름, 나이를 procedure 안에서 DECLARE 변수로 만들어봅시다. 

procedure 실행하면 여러분 이름과 여러분의 내년 나이가 출력되게 해봅시다. 

1분 깔짝 해보고 답부터 보는 사람은 코딩하면 안됩니다

 

(procedure 생성문법 생략)
DECLARE my_name VARCHAR(100) DEFAULT '홍길동';
DECLARE age INT DEFAULT 10;
SELECT my_name, age; 

procedure 만드는 문법은 생략합시다. 이러면 잘 나오는군요

DEFAULT 어쩌구 없이 그냥 등호로 넣어도 될듯요