상세 컨텐츠

본문 제목

오라클 PL/SQL

데이터베이스

by e7e 2023. 5. 7. 14:11

본문

오라클 PL/SQL은 처음 배울 땐 어렵게 느껴지지만 좀 시간이 지나서 한번 정리해 보면
베이직 문법과 비슷한 게 , 조금 귀찮을 뿐 그리 어렵지는 않습니다.
이 글을 보았다면 뜬금없이 정리 한번 해봅니다. 기본은 항상 별거없이 별거 있습니다.

1. 시작

   Table 맹글기 귀찮으니 HR계정으로 로그인

-- 일단 출력이 기본값으로 off 되어 있는데, 열어줌
set serveroutput on;
-- 기본적으로 출력문 앞의 스페이스이들이 잘려 나가는데 막고 싶다면 아래 중에 선택!
-- SET SERVEROUTPUT ON FORMAT TRUNCATED
-- SET SERVEROUTPUT ON FORMAT WRAPPED
-- set trimspool on

 

2. 구조  (사실 이런 걸 대략 기억하는 게 빠른 습득에 중요)

declare   영역-> 선언부로  생략가능

executable -영역 > 실행부로 필수

exception  영역 -> 예외부로 생략가능

 

초 심플예제로 시작

begin
dbms_output.put_line('안넝 좌00');
end;

 

3. 변수 선언

declare 영역에 한당, 대소문자 구분 안구분

변수명 타입   값할당(선택)  식으로 선언( 아래 4개  타입 정도는 머리에 담는당) 

             number, varchar2,  테이블명.컬럼명%type, 테이블명%rowtype

값 할당은 := 을 이용

 

변수 타입에 number와 varchar2를 괘니 사용해 봄

declare
v_testno number(4) := 272;
v_teststr VARCHAR2(30); -- 자릿수 부족할 때 에러 주의
begin
dbms_output.put_line('안넝 좌00');
dbms_output.put_line(v_testno);
dbms_output.put_line(v_teststr);
v_teststr := '좌00 만만세';
dbms_output.put_line(v_teststr);
end;

 

변수타입에 컬럼타입 %type 와 한줄 row를 나타내는 %rowtype (record라 부름)도 괘니 사용해 봄

declare
v_testid number(4) := 111;
v_firstname employees.first_name%type;
r_onerow employees%rowtype;
begin
select first_name into v_firstname from employees where employee_id = v_testid;
select * into r_onerow from employees where employee_id = v_testid;
dbms_output.put_line(r_onerow.employee_id || ' ' || r_onerow.phone_number || ' ' || r_onerow.salary);
dbms_output.put_line('안넝 좌00');
dbms_output.put_line(v_testid);
dbms_output.put_line(v_firstname);
end;

 

4. 조건문(if 와 case)

초 심플 (else 안 사용);

declare
v_mystar varchar2(50) := '좌oo';
begin
if v_mystar = '좌oo' then
dbms_output.put_line(' 좌oo 완전 짱!');
end if;
dbms_output.put_line(' 오늘도 행복하삼');
end;

 

elseif else 사용

declare
v_mystar varchar2(50) := 'e7e';
begin
if v_mystar = '좌oo' then
dbms_output.put_line('좌oo 완전 짱!');
elsif v_mystar = 'e7e' then
dbms_output.put_line('자화자찬 안돼용!');
else
dbms_output.put_line('누구세욤?');
end if;
dbms_output.put_line('오늘도 행복하삼');
end;

 

case 사용 예

declare
v_testCase varchar2(10) := '좌00';
v_outStr varchar2(100);
begin
dbms_output.put_line('그냥 출력해보는 거얌');
case v_testCase
when 'e7e' then v_outStr := v_testCase || ' 안농';
when '좌00' then v_outStr := v_testCase || ' 보고팡';
else v_outStr := ' 계속 보고팡';
end case;
dbms_output.put_line('aaa'|| v_outStr);
exception
when others then
begin
dbms_output.put_line('Exception Occur');
end;
end;

 

5. 반복문

loop 사용

declare
v_cnt number;
begin
dbms_output.put_line('merong');
v_cnt := 1;
loop
dbms_output.put_line('v_cnt=' || v_cnt);
v_cnt := v_cnt +1;
exit when (v_cnt > 10);
end loop;
end;

 

for  loop 사용

declare
v_exitCond varchar2(10) := '좌00';
begin
for findex in 1..10 loop
if( findex = 7 ) then
dbms_output.put_line(v_exitCond || ' ' || findex);
exit; -- 종료
end if;
dbms_output.put_line('그냥 돌깅: ' || findex);
end loop;
end;

 

while 사용

declare
v_cknum number := 1;
begin
while v_cknum <= 10 loop
dbms_output.put_line('check ' || v_cknum );
v_cknum := v_cknum +1;
end loop;
end;

 

6. 예외(Exception)

declare
begin
dbms_output.put_line('그냥 출력');
--raise no_data_found;
raise value_error;
exception
when no_data_found then
begin
dbms_output.put_line('data not found' || ' 예외 발생');
end;
when others then
begin
dbms_output.put_line('기타 ' || ' 예외 발생');
end;
end;

https://docs.oracle.com/cd/B14117_01/appdev.101/b10807/07_errs.htm

 

7. 커서(cursor)

기본

declare
cursor empcursor is select * from employees;
v_emprow employees%rowtype;
begin
open empcursor;
loop
fetch empcursor into v_emprow;
exit when empcursor%notfound;
dbms_output.put_line('email: ' || v_emprow.email );
end loop;
close empcursor;
end;

for loop를 이용 open/close  커서 생략

declare
cursor empcursor is select * from employees;
v_emprow employees%rowtype;
begin
for v_emprow in empcursor loop
dbms_output.put_line('id: ' || v_emprow.employee_id || ' email:' || v_emprow.email );
end loop;
end;

 

8. 저장 프로시저(stored procedure)

시작  일단 구성을 파악할 것

create or replace procedure firstproc
-- 매개변수 선언
is
-- 지역변수 선언
begin
dbms_output.put_line('left line state');
end;
-- 실행
execute firstproc;

 

매개변수를 1개 넘겨받는 예

-- 테이블 복사
create table emp
as select * from employees;
--
create or replace procedure del_emp(
v_empid emp.employee_id%type
)
is
begin
dbms_output.put_line('넘겨받은 값: ' || v_empid);
delete from emp where employee_id = v_empid;
commit;
end;
execute del_emp('199');

매개변수, bind변수 (in,out, in out) 사용 예

create or replace procedure sel_emp(
v_empid in emp.employee_id%type,
v_empemail out emp.email%type,
v_empsalary out emp.salary%type,
v_empphone out emp.phone_number%type
)
is
begin
select email, salary, phone_number into v_empemail, v_empsalary, v_empphone
from emp
where employee_id = v_empid;
--dbms_output.put_line('out: ' || v_empid);
end;
var v_email varchar2(25);
-- out number에는 (자릿수)를 지정하지 않아용
var v_salary number;
var v_phone varchar2(20);
execute sel_emp(104, :v_email, :v_salary, :v_phone);
print v_email
print v_salary
print v_phone

 

9. 저장 함수(stored function)

기본 구조

create or replace function firstfunc(
v_num in number
)
-- return 데이터타입
return number -- 주의 ;붙이면 안됨
is
--지역변수
begin
return v_num*4;
end;
-- execute :변수명 := 함수명(매개변수 리스트)
var retnum number;
execute :retnum := firstfunc(100);
print retnum;

매개변수 사용

create or replace function annualincome(
v_empid emp.employee_id%type
)
return number
is
v_annualincome number;
begin
select salary* 12 into v_annualincome
from emp
where employee_id = v_empid;
return v_annualincome;
end;
var yearincome number;
execute :yearincome := annualincome(100);
print yearincome

관련글 더보기