상세 컨텐츠

본문 제목

오라클 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;

exception 리스트

https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/predefined-exceptions.html

 

 

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

 

 

 


두렵고 걱정 되어도  해냈다 소리 치려면

먼저 One, Two Dive 해야만 한다.

 

그저 살아내려면 위로 올라가야 한다.

올라가 내게 소리치자.  

 

살아가는 이유는 단지 살아가고 싶어서였다고....

그저 숨을 들이쉬고 내뱉는 그 단순함에 대한...

굴욕적인 벌써  거창한 짝사랑이었음을..... 

 

https://www.youtube.com/watch?v=IENMc46TMtU&list=RDIENMc46TMtU&start_radio=1

 

관련글 더보기