DB

스토어드 프로시저2

sdafdq 2023. 11. 14. 10:53

좀더 자세히 나갈 듯.

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

이거 참조하셈.

'DB' 카테고리의 다른 글

커서  (0) 2023.11.15
스토어드 함수  (0) 2023.11.15
인덱스  (0) 2023.11.10
뷰 가상테이블  (0) 2023.11.09
제약조건  (0) 2023.11.08