DB練習13
PL/SQL
変数の宣言と割り当て
identifier [constant] datatype [not null] [:= } default expression];
= 변수 명 [변수의 값 변경할 수 없도록 제약] 자료형 [값을 반드시 포함하도록 제약] default 다른 변수나 연산자, 함수를 포함하는 표현식
PL/SQL文には4種類あります
きおくてつづき
->SQL文を順番にリストし、oracleサーバに配置
-- 프로시저를 드는데 (프로시저명)
-- is begin
-- 실행할 내용
-- commit으로 밀어넣기
-- end;
-- /
練習1-- emp 복사해서 emp01 생성
create table emp01 as
select * from emp;
-- 확인
select * from emp01;
-- 1. 프로시저 정의 ( 만들어서 저장만 해놓음 ) -> 오라클 서버에 저장
-- create or replace procedure 프로시저명 is begin [SQL문 작성] end
create or replace procedure del_all
is begin
delete from emp01;
commit;
end;
/
-- 2. 만들어 준거 실행하기 -> 오라클 사용하는 클라이언트 쪽에서 호출해 사용
execute del_all;
-- 확인 ( 틀은 살아 있는데 내용이 모두 사라짐 )
select * from emp01;
-- 저장된 프로시저 보기
--( 오라클 서버 안에 저장된 소스 (프로시저, 함수, 커서, 트리거 ) 내용을 본다
select * from user_source;
練習2-- 김사랑의 급여가 현재+100 되도록 만드는 프로시저 작성
drop table emp01;
create table emp01 as
select * from emp;
-- 프로시저 정의
create or replace procedure sel_dept10
is begin
update emp01 set sal=sal+100 where ename='김사랑';
commit;
end;
/
-- 실행
execute sel_dept10;
-- 확인
select ename, sal from emp01 where ename='김사랑';
練習3-- insert (삽입) 쿼리를 만들어보아요
create or replace procedure insert_data
is begin
insert into emp01 (empno, ename, sal, deptno)
values (1030, '홍홍홍', 300, 10);
commit;
end;
/
-- 적용해보기
execute insert_data;
-- 확인
select * from emp01;
事前保存中のパラメータの使用
プロシージャを定義するときに値を事前に決定せずに、あるタイプだけを書き、使用時に値を入れることもできます.
-- 프로시저를 드는데 (프로시저명)(새변수명 원래테이블.원래변수%type)
-- is begin
-- 실행할 내용
-- commit으로 밀어넣기
-- end;
-- /
-- vename 이라는 변수는 emp01의 ename과 같은 타입이다
create or replace procedure del_ename(vename emp01.ename%type)
is begin
delete from emp01 where ename like vename;
commit;
end;
/
-- vname 변수에 들어갈 값 쓰기
-- 이 이름이 emp01의 ename으로 가서 지워지게 된다.
execute del_ename('홍홍홍');
-- 확인
select * from emp01;
-- 이름을 넣어주면 그 사람의 월급이 +100 되도록 만들어주시오
create or replace procedure sal_plus (vname emp01.ename%type)
is begin
update emp01 set sal=sal+100 where ename=vname;
commit;
end;
/
execute sal_plus('이문세');
select * from emp01;
In、Out、Inoutパラメータ
-- in out inout 매개변수
-- in : 입력 받아올 변수 / out : 출력해줄 변수
-- 1. 프로시저 만들기
create or replace procedure sal_empno (vempno in emp01.empno%type, vename out emp01.ename%type,
vsal out emp01.sal%type, vjob out emp01.job%type)
is begin
select ename, sal, job into vename, vsal, vjob from emp01 where empno = vempno;
commit;
end;
/
-- 2. 실행 전 out 할 변수 선언하기
variable var_ename varchar2(10);
variable var_sal number;
variable var_job varchar2(9);
-- 3. 실행하기
execute sal_empno(1001, :var_ename, :var_sal, :var_job);
-- 4. print로 변수값 출력해보기
print var_ename;
print var_sal;
print var_job;
select * from dept;
-- deptno 10을 입력해서 deptno=10 도 출력하고 dname인 경리부, loc인 서울도 출력되도록 하고 싶다오
-- 1단계 프로시저 만들기 (한번에 inout은 안되고, in 한번, out 한번 따로 정의해줘야함)
create or replace procedure dname_loc (vdeptno in dept.deptno%type, vdeptno1 out dept.deptno%type,
vdname out dept.dname%type, vloc out dept.loc%type)
is begin
select deptno, dname, loc into vdeptno1, vdname, vloc from dept where deptno=vdeptno;
commit;
end;
/
-- 2. 실행 전 out할 변수 선언하기
desc dept;
variable var_deptno number;
variable var_dname varchar2(10);
variable var_loc varchar2(10);
-- 3. 실행하기
execute dname_loc (10, :var_deptno, :var_dname, :var_loc);
-- 4. print 해보기
print var_deptno;
print var_dname;
print var_loc;
きおくかんすう
->ストレージ・プロシージャとほぼ同じ用途で使用
->区別:関数は実行結果を返します
-- empno를 받아서 sal을 변경하는 저장함수 만들기
create or replace function cal_bonus (vempno in emp.empno%type)
return number
is vsal number;
begin select sal into vsal from emp where empno = vempno;
return (vsal * 200);
end;
/
-- 바이드 변수 선언 (클라이언트 쪽으로 넘길)
variable var_res number;
-- 실행하기
-- execute 함수호출 리턴자료(값)
execute :var_res :=cal_bonus(1001);
-- print해보기(학인)
print var_res;
-- execute 하지 않고 바로 select 문에서도 사용 가능하다
select ename, sal, cal_bonus(1001) from emp where empno=1001;
カーソル
->複数行を含むselect文の処理に使用します.
-- 부서 테이블의 모든 내용을 조회하기
-- 1. 커서를 이용한 프로시저 만들기
select * from dept;
create or replace procedure cursor_sample
is vdept dept%rowtype;
cursor c1 is select * from dept;
begin dbms_output.put_line('부서번호 부서번호 지역명');
dbms_output.put_line('--------------------------');
open c1;
loop fetch c1 into vdept.deptno, vdept.dname, vdept.loc;
exit when c1%notfound;
dbms_output.put_line(vdept.deptno||' ' || vdept.dname || ' ' || vdept.loc );
end loop;
close c1;
end;
/
-- 프로시저 호출하기
set serveroutput on
execute cursor_sample;
トリガ
特定のテーブルが変更されたときに自動的にイベントに変更されます.
データがDML文で入力、変更または削除されると、テーブルまたはビューが自動的に実行されます.
-- 직원이 새로 입력되면 메시지 출력하는 트리거 작성
drop table emp01;
create table emp01 (
empno number(4) primary key,
ename varchar2(20),
job varchar2(20) );
-- 1단계. 서버에 트리거 정의하기
create or replace trigger trg_sample
after insert on emp01
begin dbms_output.put_line('입사를 환영합니다.');
end;
/
-- insert 해보기
insert into emp01 values(1001, '김사랑', '사원'); -- 입사를 환영합니다. 가 삽입 안내보다 먼저 뜬다
-- 급여 정보를 자동으로 추가하는 트리거 작성
create table sal (
salno number(4) primary key,
sal number(7,3),
empno number(4) references emp01(empno) );
-- 자동으로 넘버링 해주는 시퀀스 생성
create sequence sal_seq;
-- 트리거 정의하기
create or replace trigger sal_trg
after insert on emp01
for each row
begin insert into sal values(sal_seq.nextval, 100, :new.empno);
end;
/
insert into emp01 values(3, '정', '과장');
insert into emp01 values(4, '박', '과장');
select * from emp01;
select * from sal;
-- 트리거 삭제하기
drop trigger sal_trg;
Reference
この問題について(DB練習13), 我々は、より多くの情報をここで見つけました https://velog.io/@cyhse7/DB연습하기-13テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol