좀더 자세히 나갈 듯.
https://qwefdg3.tistory.com/815
매개변수, 반환값 부분 더 나갈 듯.
매개변수를 in, return을 out
다시 remind 해 보자면(전청조 아님)
delimiter $$
create procedure user_proc()
begin
select * from member;
end $$
delimiter ;
call user_proc();
delimiter $$
create procedure 프로시저명()
begin
~~~
end $$
delimiter ;
call 프로시저명(); --프로시저 호출
걍 미리 정해두는 함수 같은거.
여기서 이제 매개변수, return을 추가할거임.
DB는 저렇게 drop 이런거 테이블, 스키마등 공통적으로 사용하는 부분이 많아서 프로시저는 저렇게 _proc 붙이는 거 괜찮은 듯.
프로시저 매개변수
delimiter $$
create procedure user_proc(in username varchar(10))
begin
select * from member where mem_name = username;
end $$
delimiter ;
call user_proc('에이핑크');
delimiter $$
create procedure 프로시저명(in 매개변수명 타입)
begin
--매개변수명을 통해 그냥 값처럼 이용
end $$
delimiter ;
call 프로시저명(매개변수에들어갈값);
보통 함수처럼 하는데,
in 매개변수명 타입
이렇게 넣어주면 됨.
당연히
(in userNumber int, in userHeight int)
이렇게 매개변수 여러 개 넣는 것도 가능.
출력은 select문을 이용한다.
return.
out 쓰면 됨.
delimiter $$
create procedure user_proc(in txtValue char(10), out outvalue int)
begin
insert into noTable values(null, txtvalue);
select max(id) into outvalue from noTable;
end $$
delimiter ;
create table if not exists noTable(
id int auto_increment primary key,
txt char(10)
);
call user_proc('테스트1',@myValue);
select concat('입력된 ID 값 ',@myValue);
근데 매개변수 넣는 자리에. 이거 그 c#에서 out 쓰는 거랑 같네.
똑같이 out 리턴으로쓸변수명 타입
저렇게 select 값 into 변수 형태로 변수에 select해서 가져온 것을 가공하거나 그대로 넣거나
아니면 set 매개변수명 = 값;
이런 식으로 해도 됨.
일단 부분적으로 나눠서 보자면,
delimiter $$
create procedure user_proc(in txtValue char(10), out outvalue int)
begin
end $$
delimiter ;
call user_proc('테스트1',@myValue);
select concat('입력된 ID 값 ',@myValue);
매개변수 하나 받는거고, 밖으로 나갈 (리턴이라고 표현하긴 하는데 밖으로 표출할 변수라는 게 더 맞는 듯.)
저렇게 하고 호출할 때는
call 프로시저명(매개변수, 받을변수명)
이렇게 해서 이번 같은 경우는 @myValue를 그냥 저렇게 변수 만들어서(@변수명 하면 자동으로 선언되는듯.)
저렇게 받은 다음에 쓰면 됨.
insert into noTable values(null, txtvalue);
select max(id) into outvalue from noTable;
여기 보면 일단 noTable이라고 해 놨는데 테이블 없다고 이름을 저렇게 지었을 거임.
테이블이 일단 존재하지 않아도 프로시저(함수)라는 것은 호출하기 전까지 실행하는 게 아니므로 프로시저 정의 할 때 대상 테이블이 없어도 된다는 것을 보여주기 위해 이렇게 한 듯.
select 값 into 변수명 from 테이블명;
저렇게 select 값 into 변수명 으로 값 넣고.
이 때 주의할 점은 out 하면서 했던 타입을 당연히 맞춰줘야 함.
if문
drop procedure if exists ifelse_proc;
delimiter $$
create procedure ifelse_proc(in memName varchar(10))
begin
declare debutYear int;
select year(debut_date) into debutYear from member where mem_name = memname;
if(debutYear >= 2015) then
select '신인 가수네요. 화이팅 하세요.' as '메시지', debutYear;
else
select '고참 가수네요. 수고하세요.' as '메시지',debutYear;
end if;
end $$
delimiter ;
call ifelse_proc('마마무');
while문
drop procedure if exists while_proc;
delimiter $$
create procedure while_proc()
begin
declare hap int;
declare num int;
set hap = 0;
set num = 1;
while (num <= 100) do
set hap = hap + num;
set num = num + 1;
end while;
select hap as '1~100 합계';
end $$
delimiter ;
call while_proc();
if, while문은 저번 스토어드 프로시저 글에 잘 설명 되어있음.
동적 쿼리 프로시저
drop procedure if exists dynamic_proc;
delimiter $$
create procedure dynamic_proc(in tablename varchar(20))
begin
set @sqlQuery = concat('select * from ', tableName);
prepare myQuery from @sqlQuery;
execute myQuery;
deallocate prepare myQuery;
end $$
delimiter ;
call dynamic_proc('member');
뭐 이런 식으로 동적으로 쿼리 문자열 만들어서 실행도 가능하다 이거임.
sql문을 일단 여러개 덧 붙여서 일단 쿼리를 문자열로 만들어서
실행하면 됨.
문자열로 저장해놨다가 실행하는 건 저렇게 준비했다가 실행해야 하는 듯
그리고 이거는 메모리에 남는 말 그대로 좀 heap? 동적인? 그런 건지 deallocate 해서 풀어줘야 함.
https://qwefdg3.tistory.com/821
이거 참조하셈.