오라클 PL/SQL은 처음 배울 땐 어렵게 느껴지지만 좀 시간이 지나서 한번 정리해 보면
베이직 문법과 비슷한 게 , 조금 귀찮을 뿐 그리 어렵지는 않습니다.
이 글을 보았다면 뜬금없이 정리 한번 해봅니다. 기본은 항상 별거없이 별거 있습니다.
Table 맹글기 귀찮으니 HR계정으로 로그인
-- 일단 출력이 기본값으로 off 되어 있는데, 열어줌 set serveroutput on; -- 기본적으로 출력문 앞의 스페이스이들이 잘려 나가는데 막고 싶다면 아래 중에 선택! -- SET SERVEROUTPUT ON FORMAT TRUNCATED -- SET SERVEROUTPUT ON FORMAT WRAPPED -- set trimspool on
declare 영역-> 선언부로 생략가능
executable -영역 > 실행부로 필수
exception 영역 -> 예외부로 생략가능
초 심플예제로 시작
begin dbms_output.put_line('안넝 좌00'); end;
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;
초 심플 (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;
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;
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
기본
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;
시작 일단 구성을 파악할 것
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
기본 구조
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
오라클 관리자 권한을 가진 계정 삭제 (0) | 2023.05.11 |
---|---|
오라클 서버 버젼 확인 (0) | 2023.05.11 |
오라클 유저생성 앤 hr 등 샘플 스키마 설치 (0) | 2023.05.11 |
오라클 암호 만료 (0) | 2023.05.06 |
오라클 http 포트 변경 (3) | 2022.05.02 |