반응형
/********************************************************************************************
-- Title : [10g] PL/SQL 변수 - %ROWTYPE, RECORD, TABLE
-- Reference : radiocom.kunsan.ac.kr baeum.com
-- Key word : rowtype record table 데이터 타입 데이터타입 data type datatype
********************************************************************************************/
/****************************************************************
-- -- %ROWTYPE 타입
****************************************************************/
ㅇ 테이블, 뷰의 행과 같은 각 column의 이름, 타입, 크기 속성으로
된 record를 만듦
ㅇ 데이터베이스 테이블명을 %ROWTYPE 앞에다 기술함
ㅇ 기본 테이블의 column 수나 datatype을 알지 못할 때 편리
ㅇ 기본 테이블의 column에 변경이 있어도 프로그램 재수정 불필요
-- 샘플 1
create or replace procedure p2(a scott.emp.empno%type)
is
emp_rec scott.emp%rowtype;
begin
select * into emp_rec
from scott.emp
where empno = a;
dbms_output.put_line('Ename : ' || emp_rec.ename);
dbms_output.put_line('Sal : ' || to_char(emp_rec.sal));
end;
/****************************************************************
-- RECORD 타입
****************************************************************/
ㅇ 여러 개의 타입을 갖는 논리적 단위의 테이터 그룹
ㅇ 하나 이상의 scolar 또는 Record, Table형의 필드를 포함해야 함
ㅇ 테이블의 행과 동일하지 않음
ㅇ 초기값을 정할 수 있음(Not Null로 정의 가능)
ㅇ 초기값이 없는 필드는 Null이 초기값임
-- 샘플 1
SET SERVEROUTPUT ON;
DECLARE
TYPE emp_record_type IS RECORD
( empno NUMBER(10)
, ename scott.emp.ename%TYPE
, deptno scott.dept.deptno%TYPE
);
empInfo emp_record_type;
BEGIN
empInfo.empno := 2000;
empInfo.ename := 'DBRANG';
empInfo.deptno := 30;
dbms_output.put_line('----------------------------');
dbms_output.put_line(to_char(empInfo.empno) || ' ' || empInfo.ename);
dbms_output.put_line(to_char(empInfo.deptno));
END;
/
-- 샘플 2
create or replace procedure scott.p3
( a scott.emp.empno%type
, b scott.emp.empno%type
)
as
type emp_rec_type is record( ename scott.emp.ename%type
, job scott.emp.job%type
, sal scott.emp.sal%type
, deptno scott.emp.deptno%type
);
emp_rec1 emp_rec_type;
emp_rec2 emp_rec_type;
begin
select ename, job, sal, deptno into emp_rec1
from emp
where empno = a;
select ename, job, sal, deptno into emp_rec1
from emp
where empno = b;
if emp_rec1.sal > emp_rec2.sal
then
dbms_output.put_line(emp_rec1.ename || ' WIN');
elsif emp_rec1.sal < emp_rec2.sal
then
dbms_output.put_line(emp_rec2.ename || ' WIN');
else
dbms_output.put_line('Their salary is same!!');
end if;
end;
/****************************************************************
-- TABLE 타입
****************************************************************/
ㅇ PL/SQL 타입은 데이터베이스 테이블과 다름
ㅇ 1차원 배열과 비슷해서 두가지 구성요소로 되어 있음
(Binary_Integer와 Scholar 타입 구성)
ㅇ 제한없이 동적으로 커짐
-- Title : [10g] PL/SQL 변수 - %ROWTYPE, RECORD, TABLE
-- Reference : radiocom.kunsan.ac.kr baeum.com
-- Key word : rowtype record table 데이터 타입 데이터타입 data type datatype
********************************************************************************************/
/****************************************************************
-- -- %ROWTYPE 타입
****************************************************************/
ㅇ 테이블, 뷰의 행과 같은 각 column의 이름, 타입, 크기 속성으로
된 record를 만듦
ㅇ 데이터베이스 테이블명을 %ROWTYPE 앞에다 기술함
ㅇ 기본 테이블의 column 수나 datatype을 알지 못할 때 편리
ㅇ 기본 테이블의 column에 변경이 있어도 프로그램 재수정 불필요
-- 샘플 1
create or replace procedure p2(a scott.emp.empno%type)
is
emp_rec scott.emp%rowtype;
begin
select * into emp_rec
from scott.emp
where empno = a;
dbms_output.put_line('Ename : ' || emp_rec.ename);
dbms_output.put_line('Sal : ' || to_char(emp_rec.sal));
end;
/****************************************************************
-- RECORD 타입
****************************************************************/
ㅇ 여러 개의 타입을 갖는 논리적 단위의 테이터 그룹
ㅇ 하나 이상의 scolar 또는 Record, Table형의 필드를 포함해야 함
ㅇ 테이블의 행과 동일하지 않음
ㅇ 초기값을 정할 수 있음(Not Null로 정의 가능)
ㅇ 초기값이 없는 필드는 Null이 초기값임
-- 샘플 1
SET SERVEROUTPUT ON;
DECLARE
TYPE emp_record_type IS RECORD
( empno NUMBER(10)
, ename scott.emp.ename%TYPE
, deptno scott.dept.deptno%TYPE
);
empInfo emp_record_type;
BEGIN
empInfo.empno := 2000;
empInfo.ename := 'DBRANG';
empInfo.deptno := 30;
dbms_output.put_line('----------------------------');
dbms_output.put_line(to_char(empInfo.empno) || ' ' || empInfo.ename);
dbms_output.put_line(to_char(empInfo.deptno));
END;
/
-- 샘플 2
create or replace procedure scott.p3
( a scott.emp.empno%type
, b scott.emp.empno%type
)
as
type emp_rec_type is record( ename scott.emp.ename%type
, job scott.emp.job%type
, sal scott.emp.sal%type
, deptno scott.emp.deptno%type
);
emp_rec1 emp_rec_type;
emp_rec2 emp_rec_type;
begin
select ename, job, sal, deptno into emp_rec1
from emp
where empno = a;
select ename, job, sal, deptno into emp_rec1
from emp
where empno = b;
if emp_rec1.sal > emp_rec2.sal
then
dbms_output.put_line(emp_rec1.ename || ' WIN');
elsif emp_rec1.sal < emp_rec2.sal
then
dbms_output.put_line(emp_rec2.ename || ' WIN');
else
dbms_output.put_line('Their salary is same!!');
end if;
end;
/****************************************************************
-- TABLE 타입
****************************************************************/
ㅇ PL/SQL 타입은 데이터베이스 테이블과 다름
ㅇ 1차원 배열과 비슷해서 두가지 구성요소로 되어 있음
(Binary_Integer와 Scholar 타입 구성)
ㅇ 제한없이 동적으로 커짐
-- 샘플 1
SET SERVEROUTPUT ON;
DECLARE
TYPE ename_table_type IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
ename_table ename_table_type;
BEGIN
ename_table(1) := '아리랑';
ename.table(2) := '아리랑';
IF ename_table.EXISTS(1) THEN ....;
END;
-- 샘플 2
CREATE TABLE scott.top_dogs (name VARCHAR2(10), salary NUMBER);
CREATE OR REPLACE PROCEDURE scott.up_test2
( v_empno IN scott.emp.empno%TYPE
)
IS
TYPE ename_table_type IS TABLE OF VARCHAR2(10)
INDEX BY BINARY_INTEGER;
ename_table ename_table_type;
TYPE sal_table_type IS TABLE OF NUMBER(7,2)
INDEX BY BINARY_INTEGER;
sal_table sal_table_type;
v_ename scott.emp.ename%TYPE;
v_sal scott.emp.sal%TYPE;
i BINARY_INTEGER := 0;
BEGIN
DELETE FROM scott.top_dogs;
SELECT ename, sal into v_ename, v_sal
FROM scott.emp WHERE empno = v_empno;
ename_table(i) := v_ename;
sal_table(i) := v_sal;
INSERT INTO scott.top_dogs(name, salary)
VALUES(ename_table(i), sal_table(i));
COMMIT WORK;
END;
-- 샘플 3
create or replace procedure scott.p4(a scott.emp.empno%type)
is
type emp_sal_table_type is table of scott.emp.sal%type
index by pls_integer;
emp_sal_tab emp_sal_table_type;
begin
select sal bulk collect
into emp_sal_tab
from scott.emp
where deptno = a
order by sal desc;
for i in emp_sal_tab.first..emp_sal_tab.last
loop
dbms_output.put_line(emp_sal_tab(i));
end loop;
end;
( v_empno IN scott.emp.empno%TYPE
)
IS
TYPE ename_table_type IS TABLE OF VARCHAR2(10)
INDEX BY BINARY_INTEGER;
ename_table ename_table_type;
TYPE sal_table_type IS TABLE OF NUMBER(7,2)
INDEX BY BINARY_INTEGER;
sal_table sal_table_type;
v_ename scott.emp.ename%TYPE;
v_sal scott.emp.sal%TYPE;
i BINARY_INTEGER := 0;
BEGIN
DELETE FROM scott.top_dogs;
SELECT ename, sal into v_ename, v_sal
FROM scott.emp WHERE empno = v_empno;
ename_table(i) := v_ename;
sal_table(i) := v_sal;
INSERT INTO scott.top_dogs(name, salary)
VALUES(ename_table(i), sal_table(i));
COMMIT WORK;
END;
-- 샘플 3
create or replace procedure scott.p4(a scott.emp.empno%type)
is
type emp_sal_table_type is table of scott.emp.sal%type
index by pls_integer;
emp_sal_tab emp_sal_table_type;
begin
select sal bulk collect
into emp_sal_tab
from scott.emp
where deptno = a
order by sal desc;
for i in emp_sal_tab.first..emp_sal_tab.last
loop
dbms_output.put_line(emp_sal_tab(i));
end loop;
end;
반응형