DataScience
article thumbnail
Published 2022. 12. 14. 13:45
PL/SQL 기초 실습 SQL
728x90

<sql />
set serveroutput on; begin dbms_output.put_line('안녕 PL/SQL'); end; -- 스칼라 변수를 선언한다. declare sonno number(4); sonname varchar2(12); -- 실행문을 시작한다. begin sonno := 1001; sonname := '홍길동'; dbms_output.put_line(' 사번 이름'); dbms_output.put_line(' ---------------'); dbms_output.put_line(' ' || sonno || ' ' || sonname); -- 실행문을 종료한다. end; -- 레퍼런스 변수를 선언한다. declare sonno emp.empno%type; sonname emp.ename%type; -- 실행문을 시작한다. begin select empno, ename into sonno, sonname from emp where ename = 'SMITH'; -- 화면에 출력한다. dbms_output.put_line(' 사번 이름'); dbms_output.put_line(' ---------------'); dbms_output.put_line(' ' || sonno || ' ' || sonname); --dbms_output.put_line( sonno||sonname); -- 실행문을 종료한다. end; -- 레퍼런스 변수를 선언한다. declare sonemp emp%rowtype; sonsal number(7,2); begin select * into sonemp from emp where ename='SMITH'; -- 커미션이 null 일 경우를 조건에 지정하고 수행한다. if (sonemp.comm is null) then sonsal := sonemp.sal*12; -- 조건이 false 이거나 null 이면 수행을 종료한다. end if; dbms_output.put_line(' 사번 이름 커미션'); dbms_output.put_line('--------------------------'); dbms_output.put_line(' '||sonemp.empno||' '||sonemp.ename||' '||sonsal); end; -- 레퍼런스 변수를 선언한다. declare sonemp emp%rowtype; sonsal number(7,2); begin select * into sonemp from emp where ename='ALLEN'; -- 커미션이 null 일 경우를 조건에 지정하고 수행한다. if (sonemp.comm is null) then sonsal := sonemp.sal*12; -- 조건이 false 이거나 null 이면 수행을 종료한다. else sonsal := 0; end if; dbms_output.put_line(' 사번 이름 커미션'); dbms_output.put_line('--------------------------'); dbms_output.put_line(' '||sonemp.empno||' '||sonemp.ename||' '||sonsal); end; -- 저장 프로시저에 사용할 테이블을 emp 테이블에서 복사한다. create table empcopy as select * from emp; /*실습 2: 생성한 테이블 정보를 조회한다.*/ -- 생성한 테이블의 정보를 조회한다. select * from empcopy; /*실습 3: 저장 프로시저를 생성한다.*/ -- 저장 프로시저를 생성한다. create or replace procedure del_all is begin -- empcopy 테이블의 저장된 데이터를 삭제한다. delete from empcopy; -- 트랜잭션 작업이 성공하여 완료한다. commit; end; -- 저장 프로시저를 실행하여 empcopy 테이블에 저장된 데이터를 삭제한다. execute del_all; select * from empcopy; -- user_source 시스템 테이블의 구조를 확인한다. desc user_source; -- 저장 프로시저의 코드를 확인한다. select name, type, line, text from user_source; --3) 저장 프로시저의 매개변수 -- 저장 프로시저에 사용할 테이블을 emp 테이블에서 복사한다. create table empcopy2 as select * from emp; -- 생성한 테이블의 정보를 조회한다. select * from empcopy2; -- 매개변수가 존재하는 저장 프로시저를 생성한다. create or replace procedure del_ename(sonename empcopy2.ename%type) is begin -- empcopy 테이블의 저장된 데이터를 조건에 맞게 삭제한다. delete from empcopy2 where ename like sonename; -- 트랜잭션 작업이 성공하여 완료한다. commit; end; execute del_ename('S%'); select * from empcopy2; --4) 바인드 변수를 통한 부서 정보 조회 -- 매개변수가 존재하는 저장 프로시저를 생성한다. create or replace procedure dept_select ( -- in 모드로 dept 테이블의 deptno 컬럼에 입력한 값을 vdeptno 매개변수에 전달한다. vdeptno in dept.deptno%type, -- out 모드로 dept 테이블의 dname 컬럼값을 받아와서 vdname 매개변수에서 호출한다. vdname out dept.dname%type, -- out 모드로 dept 테이블의 loc 컬럼값을 받아와서 vloc 매개변수에서 호출한다. vloc out dept.loc%type) is begin -- select 문으로 수행한 결과값을 into 문 뒤에 선언한 변수에 저장한다. select dname, loc into vdname, vloc from dept where deptno=vdeptno; end; /* 컬럼에 저장된 값을 호스트 환경에서 생성하여 데이터를 저장하기 위해 바인드 변수를 선언한다. variable 명령어를 사용하여 PL/SQL 블록에서도 사용할 수 있다. 저장 프로시저의 매개변수와 바인드 변수의 이름은 같을 필요는 없지만, 데이터 타입은 반드시 같아야 한다. */ variable vdname varchar2(30); variable vloc varchar2(30); -- 바인드 변수를 호출하는 저장 프로시저를 실행하고 바인드 변수는 :(콜론)을 덧붙여 --사용한다. execute dept_select(40, :vdname, :vloc); -- 바인드 변수는 print 명령어로 출력할 수 있으므로 print 명령어로 출력한다. print vdname; print vloc; --5) 바인드 변수를 통한 사원정보 조회 --사원정보를 조회하는 저장 프로시저를 생성한다. -- 매개변수가 존재하는 저장 프로시저를 생성한다. create or replace procedure sel_empno ( sonempno in emp.empno%type, sonename out emp.ename%type, sonsal out emp.sal%type, sonjob out emp.job%type) is begin select ename, sal, job into sonename, sonsal, sonjob from emp where empno=sonempno; end; --실습 2: --바인드 변수로 데이터를 저장하고 사원 번호로 사원정보를 조회한다. --컬럼에 저장된 값을 호스트 환경에서 생성하여 데이터를 저장하기 위해 바인드 변수를 --선언한다. variable var_ename varchar2(15); variable var_sal number; variable var_job varchar2(9); -- 바인드 변수를 호출하는 저장 프로시저를 실행하고 바인드 변수는 :(콜론)을 덧붙여 --사용한다. execute sel_empno(7369, :var_ename, :var_sal, :var_job); -- 바인드 변수는 print 명령어로 출력할 수 있으므로 print 명령어로 출력한다. print var_ename; print var_sal; print var_job; --6) 저장 프로시저의 insert 데이터 조작어 --dept 테이블에 데이터를 입력할 저장 프로시저를 생성한다. create or replace procedure dept_insert( -- in 모드로 dept 테이블의 deptno 컬럼에 입력한 값을 vdeptno 매개변수에 전달한다. vdeptno in dept.deptno%type, -- in 모드로 dept 테이블의 dname 컬럼에 입력한 값을 vdname 매개변수에 전달한다. vdname in dept.dname%type, -- in 모드로 dept 테이블의 loc 컬럼에 입력한 값을 vloc 매개변수에 전달한다. vloc in dept.loc%type) is begin insert into dept values(vdeptno, vdname, vloc); end; --실습 2: --dept 테이블에 데이터를 입력할 저장 프로시저를 실행한다. -- 저장 프로시저로 데이터를 입력한다. execute dept_insert(80, '기획실','서울'); execute dept_insert(70, '안전과2','인천'); --실습 3: --dept 테이블에서 입력한 저장 프로시저 실행을 확인한다. -- 입력한 저장 프로시저에 대한 실행을 확인한다. select * from dept; --7) 저장 프로시저의 update 데이터 조작어 --dept 테이블에 데이터를 수정할 저장 프로시저를 생성한다. create or replace procedure dept_update( -- in 모드로 dept 테이블의 deptno 컬럼에 입력한 값을 vdeptno 매개변수에 전달한다. vdeptno in dept.deptno%type, -- in 모드로 dept 테이블의 dname 컬럼에 입력한 값을 vdname 매개변수에 전달한다. vdname in dept.dname%type, -- in 모드로 dept 테이블의 loc 컬럼에 입력한 값을 vloc 매개변수에 전달한다. vloc in dept.loc%type) is begin update dept set deptno= vdeptno, dname= vdname, loc=vloc where deptno = vdeptno; end; --실습 2: --dept 테이블에 저장 프로시저로 데이터를 수정한다. -- 저장 프로시저로 데이터를 수정한다. execute dept_update(50, '기획실','부산'); --실습 3: --dept 테이블에서 수정한 저장 프로시저 실행을 확인한다. -- 수정한 저장 프로시저에 대한 실행을 확인한다. select * from dept; --8) 저장 프로시저의 delete 데이터 조작어 --실습 1: --dept 테이블에 데이터를 삭제할 저장 프로시저를 생성한다. create or replace procedure dept_delete( -- in 모드로 dept 테이블의 deptno 컬럼에 입력한 값을 vdeptno 매개변수에 전달한다. vdeptno in dept.deptno%type) is begin delete from dept where deptno = vdeptno; end; --실습 2: --dept 테이블에 저장 프로시저로 데이터를 삭제한다. -- 저장 프로시저로 데이터를 삭제한다. execute dept_delete(60,70,80); --실습 3: --dept 테이블에서 삭제한 저장 프로시저 실행을 확인한다. -- 삭제한 저장 프로시저에 대한 실행을 확인한다. select * from dept; --1) 급여 200% 보너스 지급 -- 매개변수가 존재하는 저장 함수를 생성한다. create or replace function cal_bonus( -- in 모드로 emp 테이블의 empno 컬럼에 입력한 값을 sonempno 매개변수에 전달한다. sonempno in emp.empno%type) -- number 데이터 타입의 값을 반환한다. return number is sonsal number(7, 2); begin select sal into sonsal from emp where empno = sonempno; -- 조회 결과로 얻어진 급여로 200% 보너스를 구해서 함수의 결과값으로 반환한다. return (sonsal * 2); end; --실습 2: --바인드 변수로 데이터를 저장하고 급여를 조회한다. --컬럼에 저장된 값을 호스트 환경에서 생성하여 데이터를 저장하기 위해 바인드 변수를 --선언한다. variable var_res number; -- 바인드 변수를 호출하는 저장 함수를 실행하고 바인드 변수는 :(콜론)을 덧붙여 사용한다. execute :var_res := cal_bonus(7369); -- 바인드 변수는 print 명령어로 출력할 수 있으므로 print 명령어로 출력한다. print var_res; --1) 명시적 커서로 dept 테이블의 모든 데이터 조회 create or replace procedure cursor_call is -- %rowtype 속성으로 dept 테이블의 모든 컬럼을 참조하는 레퍼런스 sonemp --변수를 선언한다. sondept dept%rowtype; -- soncursor 커서를 생성한다. cursor soncursor is select * from dept; begin dbms_output.put_line('부서번호 부서명 지역명'); dbms_output.put_line('--------------------------------------'); -- 생성한 soncursor 커서를 연다. open soncursor; -- end loop 문에서 제어권을 전달받고 반복한다. loop -- soncursor 커서에서 행을 정보를 획득하고 저장하고 다음 행으로 이동한다. fetch soncursor into sondept.deptno, sondept.dname, sondept.loc; -- 해당 커서 안에 수행해야 할 데이터가 없을 때 루프를 종료한다. exit when soncursor%notfound; dbms_output.put_line(sondept.deptno||' '||sondept.dname||' '||sondept.loc); -- 제어권을 loop 문으로 전달한다. end loop; -- 사용한 soncursor 커서를 닫는다. close soncursor; end; -- 화면 출력기능을 활성화한다. set serveroutput on -- 저장 프로시저를 실행하여 dept 테이블의 모든 컬럼을 출력한다. execute cursor_call; /*p_var1은 IN 매개변수로 써, 사용자가 입력한 값인 ‘A’ 그대로 출력된 것을 확인하실 수 있습니다. OUT 매개변수인 p_var2 자리에 v_var2 변수를 넣어 ‘B’ 라는 값을 넘겨 줬음에도 불구하고 아무런 값도 없이 출력된 것을 확인하실 수 있습니다. 반대로, IN OUT 매개변수인 p_var3에는 ‘C’ 란 값을 넘겨 줬더니 프로시저 내부에서 ‘C’ 라는 값을 한 번 출력하고 다시 ‘B2’ 라는 값을 할당 받아서 최종적으로 v_var3 값은 ‘B2’ 가 된 것을 확인하실 수 있습니다.*/ CREATE OR REPLACE PROCEDURE my_INOUT_proc ( p_var1 VARCHAR2, p_var2 OUT VARCHAR2, p_var3 IN OUT VARCHAR2 ) IS BEGIN DBMS_OUTPUT.PUT_LINE('p_var1 = ' || p_var1); DBMS_OUTPUT.PUT_LINE('p_var2 = ' || p_var2); DBMS_OUTPUT.PUT_LINE('p_var3 = ' || p_var3); p_var2 := 'A2'; p_var3 := 'B2'; END; DECLARE v_var1 VARCHAR2(100) := 'A'; v_var2 VARCHAR2(100) := 'B'; v_var3 VARCHAR2(100) := 'C'; BEGIN my_INOUT_proc(v_var1, v_var2, v_var3); DBMS_OUTPUT.PUT_LINE ('v_var2 = ' || v_var2); DBMS_OUTPUT.PUT_LINE ('v_var3 = ' || v_var3); END; --4. 트리거 -- emp_son 테이블을 생성한다. create table emp_son( empno number(4) primary key, ename varchar2(12), job varchar2(21) ); -- 트리거를 생성한다. create or replace trigger trg_son -- insert 문이 실행되고 난 후에 트리거를 실행한다. after -- emp_son 테이블에 데이터가 입력할 때 이벤트를 발생시킨다. insert on emp_son begin dbms_output.put_line('신입사원이 입사했습니다.'); end; -- 화면 출력기능을 활성화한다. insert into emp_son values(1, '홍길동', '대리');

'SQL' 카테고리의 다른 글

SQL Oracle DB XE 11g환경 구축  (1) 2022.12.14
SQL 서브쿼리 연습문제  (2) 2022.12.14
PL/SQL 프로시저 IN, OUT, IN OUT 차이  (1) 2022.12.14
R-SQL(ORACLE) 연동 기초 문제  (0) 2022.12.14
R-SQL 연동(csv,DataFrame)  (0) 2022.12.14
profile

DataScience

@Ninestar

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!