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