Day30
26223 ワード
Day30
Q 1)作成したプロセスリストの表示SELECT* FROM user_procedures;
Q 2)プロセス内容の確認SELECT*FROM USER_SOURCE;
Q 3)申請部署番号20の社員の社員番号、氏名、給与のプロセスEX 01
カーソルの宣言方法:変数のように使用します.1つ以上のrowオブジェクトのオブジェクトを管理するCREATE OR REPLACE PROCEDURE EX01
AS
v_empno emp.empno%type;
v_ename emp.ename%type;
v_sal number(7,2) := 0;
cursor emp_cursor is (**1. 커서 선언** : 하나 이상의 row를 담는 객체 cursor user_name is ~)
select empno, ename, sal
from emp where deptno=20;
Begin
OPEN emp_cursor ; (**2. 커서를 시작**)
loop
FETCH emp_cursor into v_empno, v_ename, v_sal ; (**3. 변수 대입**)
exit when emp_cursor%rowcount > 5 or emp_cursor%notfound;
DBMS_OUTPUT.PUT_LINE(v_empno||' '|| v_ename ||' '|| v_sal);
end loop;
close emp_cursor; (** 4.커서 종료**)
end EX01;
Q 4)EX 01プロセスの実行SET SERVEROUTPUT ON
EXECUTE EX01;
Q 5)社員表に社員の名前と給料を印刷する.EX 02プロセスの作成SELECT ENAME, SAL
FROM EMP
CREATE OR REPLACE PROCEDURE EX02
AS
v_ename emp.ename%type;
v_sal number(7,2) := 0;
cursor emp_cursor is --(1. 커서 선언)
select ename, sal
from emp;
Begin
OPEN emp_cursor ; -- (2. 커서를 시작)
loop
FETCH emp_cursor into v_ename, v_sal ; --(3.변수 대입)
exit when emp_cursor%rowcount > 5 or emp_cursor%notfound;
DBMS_OUTPUT.PUT_LINE(v_ename ||' '|| v_sal);
end loop;
close emp_cursor; -- (4.커서 종료)
end EX02;
Q 6)運転中に部門番号を渡して出力部門番号を作成するプロセスEX 03SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE DEPTNO =10; -- V_DEPTNO (커서의 매개변수로 선언)
SELECT EMPNO, ENMAE,SAL
FROM EMP
WHERE DEPTNO=20; -- V_DEPTNO (커서의 매개변수로 선언)
EXEC EX03;
-- **프로시저를 실행 할 때 부서번호를 전달해서 해당 부서번호를 출력하는 프로시저 만들기 EX03**
CREATE OR REPLACE PROCEDURE EX03 AS
V_EMPNO emp.empno%TYPE;
V_ENAME emp.ename%TYPE;
V_SAL EMP.SAL%TYPE;
cursor emp_cursor(V_DEPTNO NUMBER) is --(1. 커서 선언)
select EMPNO, ename, sal
from emp
WHERE DEPTNO=V_DEPTNO;
BEGIN
OPEN emp_cursor(10) ; --(2.커서를 시작)
loop
FETCH emp_cursor into v_empno, v_ename, v_sal ; --(3. 변수 대입)
exit when emp_cursor%rowcount > 5 or emp_cursor%notfound;
DBMS_OUTPUT.PUT_LINE(v_empno||' '|| v_ename ||' '|| v_sal);
end loop;
close emp_cursor; -- (4.커서 종료)
OPEN emp_cursor(20) ; -- 2. 커서를 시작
loop
FETCH emp_cursor into v_empno, v_ename, v_sal ; --3. 변수 대입
exit when emp_cursor%rowcount > 5 or emp_cursor%notfound;
DBMS_OUTPUT.PUT_LINE(v_empno||' '|| v_ename ||' '|| v_sal);
end loop;
close emp_cursor; -- 4.커서 종료
end EX03;
Q 7)宣言されたカーソルcursor user name is構文;
SELECT* FROM user_procedures;
SELECT*FROM USER_SOURCE;
CREATE OR REPLACE PROCEDURE EX01
AS
v_empno emp.empno%type;
v_ename emp.ename%type;
v_sal number(7,2) := 0;
cursor emp_cursor is (**1. 커서 선언** : 하나 이상의 row를 담는 객체 cursor user_name is ~)
select empno, ename, sal
from emp where deptno=20;
Begin
OPEN emp_cursor ; (**2. 커서를 시작**)
loop
FETCH emp_cursor into v_empno, v_ename, v_sal ; (**3. 변수 대입**)
exit when emp_cursor%rowcount > 5 or emp_cursor%notfound;
DBMS_OUTPUT.PUT_LINE(v_empno||' '|| v_ename ||' '|| v_sal);
end loop;
close emp_cursor; (** 4.커서 종료**)
end EX01;
SET SERVEROUTPUT ON
EXECUTE EX01;
SELECT ENAME, SAL
FROM EMP
CREATE OR REPLACE PROCEDURE EX02
AS
v_ename emp.ename%type;
v_sal number(7,2) := 0;
cursor emp_cursor is --(1. 커서 선언)
select ename, sal
from emp;
Begin
OPEN emp_cursor ; -- (2. 커서를 시작)
loop
FETCH emp_cursor into v_ename, v_sal ; --(3.변수 대입)
exit when emp_cursor%rowcount > 5 or emp_cursor%notfound;
DBMS_OUTPUT.PUT_LINE(v_ename ||' '|| v_sal);
end loop;
close emp_cursor; -- (4.커서 종료)
end EX02;
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE DEPTNO =10; -- V_DEPTNO (커서의 매개변수로 선언)
SELECT EMPNO, ENMAE,SAL
FROM EMP
WHERE DEPTNO=20; -- V_DEPTNO (커서의 매개변수로 선언)
EXEC EX03;
-- **프로시저를 실행 할 때 부서번호를 전달해서 해당 부서번호를 출력하는 프로시저 만들기 EX03**
CREATE OR REPLACE PROCEDURE EX03 AS
V_EMPNO emp.empno%TYPE;
V_ENAME emp.ename%TYPE;
V_SAL EMP.SAL%TYPE;
cursor emp_cursor(V_DEPTNO NUMBER) is --(1. 커서 선언)
select EMPNO, ename, sal
from emp
WHERE DEPTNO=V_DEPTNO;
BEGIN
OPEN emp_cursor(10) ; --(2.커서를 시작)
loop
FETCH emp_cursor into v_empno, v_ename, v_sal ; --(3. 변수 대입)
exit when emp_cursor%rowcount > 5 or emp_cursor%notfound;
DBMS_OUTPUT.PUT_LINE(v_empno||' '|| v_ename ||' '|| v_sal);
end loop;
close emp_cursor; -- (4.커서 종료)
OPEN emp_cursor(20) ; -- 2. 커서를 시작
loop
FETCH emp_cursor into v_empno, v_ename, v_sal ; --3. 변수 대입
exit when emp_cursor%rowcount > 5 or emp_cursor%notfound;
DBMS_OUTPUT.PUT_LINE(v_empno||' '|| v_ename ||' '|| v_sal);
end loop;
close emp_cursor; -- 4.커서 종료
end EX03;
CREATE OR REPLACE PROCEDURE EX04 (P_EMPNO IN EMP.EMPNO%TYPE)
AS
V_SAL EMP.SAL%TYPE;
V_UPDATE_CNT NUMBER;
BEGIN
SELECT SAL INTO V_SAL
FROM EMP
WHERE EMPNO = P_EMPNO;
IF SQL%FOUND THEN --명시적 커서가 있다면 다음을 수행하자.
DBMS_OUTPUT.PUT_LINE('검색한 데이터가 존재한다 '|| V_SAL);
UPDATE EMP
SET SAL= SAL*1.1
WHERE EMPNO=P_EMPNO;
V_UPDATE_CNT := SQL%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE('급여가 인상된 사원의 수'|| V_UPDATE_CNT);
END IF;
END EX04;
EXEC EX04(7900);
Q 8)宣言されたカーソルuser name is構文;EX 05の作成プロセスを使用します.部門番号に対応する給与を入力し、1.1%の昇給金額に変更し、4回、氏名、給与を出力します.FOR文を使用します.
CREATE OR REPLACE PROCEDURE EX05 (P_DEPTNO IN EMP.DEPTNO%TYPE)AS
CURSOR EMP_CURSOR IS
SELECT EMPNO,ENAME,SAL
FROM EMP
WHERE DEPTNO = P_DEPTNO
FOR UPDATE;
BEGIN
FOR ABC IN EMP_CURSOR LOOP
UPDATE EMP
SET SAL = SAL*1.1
WHERE CURRENT OF EMP_CURSOR; --현재 커서의 ROW를 가져와서 수정 하겠다.
DBMS_OUTPUT.PUT_LINE(ABC.EMPNO || ' ' || ABC.ENAME || ' '||ABC.SAL);
END LOOP;
END EX05;
EXEC EX05(20);
Q 9)EX 06を実行し、EMPテーブルの全内容を返す SELECT * FROM EMP;
CREATE OR REPLACE PROCEDURE EX06 ( MY_RES OUT SYS_REFCURSOR) AS
BEGIN
OPEN MY_RES FOR
SELECT * FROM EMP;
END EX06;
VAR RES REFCURSOR;
EXEC EX06(:RES)
PRINT :RES;
Q 10)EX 07を実行して職業を入力し、社員の全ての情報を返すCREATE OR REPLACE PROCEDURE EX07 (M_JOB IN EMP.JOB%TYPE ,M_RES OUT SYS_REFCURSOR ) AS
BEGIN
OPEN M_RES FOR
SELECT * FROM EMP WHERE JOB =M_JOB;
END EX07;
VAR RES REFCURSOR;
EXEC EX07('SALESMAN',:RES);
PRINT :RES;
Q 11)パッケージ:高度に関連する関数またはプロセスを組み合わせて管理と使用する--spec
CREATE OR REPLACE PACKAGE my_package
is
procedure my_sum;
procedure my_avg;
end my_package;
--body
CREATE OR REPLACE PACKAGE BODY my_package
IS
procedure my_sum IS
CURSOR E_SUM IS
SELECT SUM(NVL(SAL,0)) FROM EMP;
TOTAL_SUM NUMBER;
BEGIN
OPEN E_SUM;
FETCH E_SUM INTO TOTAL_SUM;
DBMS_OUTPUT.PUT_LINE('봉급의 합계 : '|| TOTAL_SUM);
CLOSE E_SUM;
END my_sum;
procedure my_avg IS
CURSOR E_AVG IS
SELECT SUM(NVL(SAL,0)) FROM EMP;
TOTAL_avg NUMBER;
BEGIN
OPEN E_AVG;
FETCH E_AVG INTO TOTAL_AVG;
DBMS_OUTPUT.PUT_LINE('봉급의 합계 : '|| TOTAL_AVG);
CLOSE E_avg;
END MY_avg;
END MY_PACKAGE;
Reference
この問題について(Day30), 我々は、より多くの情報をここで見つけました https://velog.io/@jahommer/Day30テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol