2021년 12월 25일 토요일

PLSQL 명시적커서4단계, 선언, OPEN, FETCH, CLOSE, PL/SQL커서란, SQL교육, 오라클교육, 자바교육, 오라클학원

 












PLSQL 명시적커서4단계, 선언, OPEN, FETCH, CLOSE, PL/SQL커서란, SQL학원, SQL교육, 오라클학원, 오라클교육


오라클 PL/SQL




명시적 커서(Explicit Cursor)

이론 및 실습


이종철



명시적 커서(Explicit Cursor)


  • 멀티 로우를  SELECT 하기위해 사용한다.
  • 선언(Declaring) : Declare 섹션에서 정의한다. 메모리 초기화 단계이며 커서에 이름을 부여하고 SELECT문장을 정의하며, SELECT문에는 INTO 절이 필요없다.

CURSOR c_emp IS SELECT * FROM emp;

  • 오픈(Opening) : SQL문장을 실행하고 커서를 위한 메모리를 할당하며 BEGIN 절에서 실행한다. 커서는 SELECT된 데이터(Active Set)의 첫번째 레코드에 포인터가 위치하고 패치단계에서 사용할 수 있게 된다. OPEN시 실행되는 SQL문장에서 추출되는 레코드가 없더라도 오류가 발생하지 않고 데이터가 없다는 것은 이후 FETCH를 마친 후 커서 속성값을 통해 판단 할 수 있다.(%FOUND)

OPEN c_emp;

  • 패치(Fetching) : 데이터 추출단계이며 FETCH되는 레코드가 없더라도 오류가 발생하지 않는다. INTO절 다음에 오는 칼럼 리스트는 SELECT시 정의한 칼럼 리스트와 개수, 타입이 동일해야 한다. “SELECT *” 등으로 커서를 만들었다면 %ROWTYPE을 적절히 이용하면 된다.

FETCH c_emp INTO c_emp_record;

  • 종료(Closing) : 커서 Closing

CLOSE c_emp;


[명시적 커서의 속성]

커서이름%ISOPEN : 커서가 오픈되었으면 TRUE

커서이름%FOUND : FETCH했는데 레코드가 있었으면 TRUE

커서이름%NOTFOUND : FETCH했는데 레코드가 없었으면 TRUE

커서이름%ROWCOUNT : 지금까지 FETCH한 데이터 건수 


SQL> SET SERVEROUTPUT ON

SQL> DECLARE

       CURSOR c_emp IS

       SELECT ename, sal FROM emp WHERE deptno = 10;

       v_ename emp.ename%TYPE;

       v_sal   emp.sal%TYPE;

    BEGIN

       OPEN c_emp;

       LOOP

          FETCH c_emp INTO v_ename, v_sal;

         EXIT WHEN c_emp%NOTFOUND OR c_emp%NOTFOUND IS NULL;

         DBMS_OUTPUT.PUT_LINE(c_emp%ROWCOUNT || '. ' || v_ename || ',' || v_sal);

      END LOOP;

      CLOSE c_emp;

   END;

   /


1. CLARK,2837

2. KING,5789

3. MILLER,1505


-- CURSOR FOR LOOP는 커서의 레코드를 알아서 다 처리해주므로 EXIT WHEN이 필요없다

-- 알아서 OPEN하고 알아서 FETCH, Closing 한다. 즉 선언만 하여 사용하면 된다.

SQL> DECLARE

       CURSOR c_emp IS

       SELECT ename, sal FROM emp WHERE deptno = 10;

    BEGIN

       FOR emp_record IN c_emp LOOP

          DBMS_OUTPUT.PUT_LINE(c_emp%ROWCOUNT || '. '

               || emp_record.ename || ',' || emp_record.sal);

       END LOOP;

    END;

   /


1. CLARK,2837

2. KING,5789

3. MILLER,1505


-- 아래와 같이 커서 정의를 CURSOR FOR LOOP헤더에서 해도 된다.

-- 물론 커서이름이 없으니 커서의 속성은 사용하지 못한다.

SQL> DECLARE

    BEGIN

       FOR emp_record IN (SELECT ename, sal FROM emp WHERE deptno = 10) LOOP

          DBMS_OUTPUT.PUT_LINE(emp_record.ename || ',' || emp_record.sal);

       END LOOP;

    END;

  /


CLARK,2837

KING,5789

MILLER,1505


#PLSQL, #명시적커서, #오라클커서, #커서란, #SQL학원, #SQL교육, #오라클학원, #오라클교육, #오라클동영상, #자바학원, #자바교육, PLSQL, #명시적커서, 오라클커서, 커서란, SQL학원, SQL교육, 오라클학원, 오라클교육, 오라클동영상, 자바학원, 자바교육,  

2021년 12월 24일 금요일

PLSQL 제어문,반복문, IF, LOOP, END LOOP, FOR LOOP, WHILE LOOP, PL/SQL동영상, 자바학원, 오라클학원, JAVA학원, ORACLE학원

 










PLSQL 제어문,반복문, IF, LOOP, END LOOP, FOR LOOP, WHILE LOOP, PL/SQL동영상


오라클 PL/SQL




제어문, 반복문


강의 : 이종철



PL/SQL IF문


[형식]

IF condition1 THEN

   Condition1이 만족하는 경우 실행할 문장

ELSIF condition2 THEN

 Condition2가 만족하는 경우 실행할 문장

ELSE

   이외의 경우 실행할 문장

END IF;



-- EMP 테이블에서 이름을 입력받아 급여가 3000보다 크면 'high sal' 

-- 2000보다 크면 'mid sal' 그밖에는 'low sal'을 출력하는 프로시저를 작성하세요.


SQL> SET SERVEROUTPUT ON

SQL> CREATE OR REPLACE PROCEDURE OJC16(v_ename emp.ename%TYPE)

    IS

    v_sal emp.sal%TYPE;

    BEGIN

      SELECT sal INTO v_sal

      FROM EMP

      WHERE ename = v_ename;

  

      IF v_sal >= 3000 THEN

       DBMS_OUTPUT.PUT_LINE('high sal...');

     ELSIF v_sal >= 2000 THEN

       DBMS_OUTPUT.PUT_LINE('mid sal...');

     ELSE

       DBMS_OUTPUT.PUT_LINE('low sal...');

     END IF;

   EXCEPTION

     WHEN NO_DATA_FOUND OR TOO_MANY_ROWS THEN

       DBMS_OUTPUT.PUT_LINE('Data 추출에러');

  END;

   /


프로시저가 생성되었습니다.


SQL> exec ojc16('SMITH')

low sal...


SQL> exec ojc16('KING')

high sal...


SQL> exec ojc16('없는사원')

Data 추출에러



BASIC LOOP문


  • LOOP~END LOOP 형태이며 무한루프이므로 출구가 있어야 한다.(EXIT or EXIT WHEN절)
  • LOOP COUNTER 변수 등은 직접 다루어야 한다.

 

[형식]

LOOP

  실행문장;

END LOOP;


-- LOOP ~ END LOOP, EXIT 이용한 예제

SQL> SET SERVEROUTPUT ON

SQL> DECLARE

       x number := 10;

    BEGIN

       LOOP

          DBMS_OUTPUT.PUT_LINE(x);

          x := x - 1;

          IF x < 1 THEN

             EXIT;

          END IF;

      END LOOP;

      DBMS_OUTPUT.PUT_LINE('x = ' || x);

   END;

   /


10

9

8

1

x = 0


-- LOOP ~ END LOOP, EXIT WHEN 이용한 예제

SQL> DECLARE

       x number := 10;

    BEGIN

       LOOP

          DBMS_OUTPUT.PUT_LINE(x);

          x := x - 1;

          EXIT WHEN x < 1;

       END LOOP;

       DBMS_OUTPUT.PUT_LINE('x = ' || x);

   END;

   /

10

9

8

1

x = 0



FOR LOOP문


  • LOOP~END LOOP 앞에 FOR 제어문을 가지므로 루프 카운터 변수가 필요없고 LOOP~END LOOP 안쪽에 출구 역시 필요없다.
  • 인덱스는 자동으로 선언되며 자동으로 1씩 증가하고 REVERSE라고 하면 상한값에서 초기값으로 -1씩 증가한다.(초기값과 상한값의 위치가 바뀌어서는 안된다.)


[형식]

FOR 인덱스 IN [REVERSE] 초기값 .. 상한값 LOOP

   실행문장;

END LOOP; 




-- FOR LOOP예제

SQL> SET SERVEROUTPUT ON

SQL> DECLARE

    BEGIN

      FOR x IN 1..10 LOOP

         DBMS_OUTPUT.PUT_LINE(x);

      END LOOP;

    END;

    /

1

10


-- FOR LOOP예제(REVERSE)

SQL> DECLARE

    BEGIN

      FOR x IN REVERSE 1..10 LOOP

         DBMS_OUTPUT.PUT_LINE(x);

      END LOOP;

    END;

    /

10

9



WHILE LOOP문


  • 조건이 만족하는 동안 LOOP~END LOOP를 실행하므로 별도의 출구는 필요없지만 루프 카운터 변수등은 선언해서 사용해야 한다.
  • 조건에 만족하지 않으면 반복문내 실행문이 한번도 실행되지 않는다.


[형식]

WHILE 조건 LOOP

   실행문장;

END LOOP;


SQL> SET SERVEROUTPUT ON

SQL> DECLARE

      x NUMBER := 10;

    BEGIN

      WHILE(x > 0) LOOP

        DBMS_OUTPUT.PUT_LINE(x);

        x := x - 1;

      END LOOP;

      DBMS_OUTPUT.PUT_LINE('x = ' || x);

    END;

   /

10

9

1

x = 0





#PLSQL, #제어문, #반복문, #PLSQLIF, #PLSQLLOOP, #PLSQL반복문, #PLSQL제어문, #PLSQL동영상, #PLSQL교육, #SQL학원, #SQL교육, #오라클학원, #오라클교육, PLSQL, 제어문, 반복문, PLSQLIF, PLSQLLOOP, PLSQL반복문, PLSQL제어문, PLSQL동영상, PLSQL교육, SQL학원, SQL교육, 오라클학원, 오라클교육, 


PL/SQL에서 SQL, SELECT 사용, SELECT 예외처리, too_many_rows , no_data_found, 오라클PLSQL동영상, PLSQL교육, 오라클교육, 자바교육, ORACLE교육

 









PL/SQL에서 SQL, SELECT 사용, SELECT 예외처리, too_many_rows , no_data_found, 오라클PLSQL동영상, 오라클교육, 자바학원, 오라클학원


오라클 PL/SQL



SELECT 사용하기

SELECT 예외처리



강의 : 이종철




PL/SQL에서 SQL문장 사용


  • PL/SQL은 SELECT, INSERT, UPDATE, DELETE와 같은 DML(Data Manipulation Language) 및 COMMIT, ROLLBACK과 같은 TCL(Transaction Control Language)을 지원 합니다.
  • DDL(Data Definition Language)에 대해서는 지원하지 않습니다.(CREATE, DROP, ALTER). 만약 사용하려 한다면 Dynamic SQL(EXECUTE IMMEDIATE 구문, DBMS_SQL패키지 이용)을 사용해야 합니다.
  • DCL(Data Control Language)도 지원하지 않습니다.(GRANT, REVOKE)


SELECT문의 사용


  • SELECT문의 종료는 세미콜론(;)으로 표시한다.
  • SELECT절의 칼럼목록과 INTO절의 칼럼목록은 개수 및 데이터 타입이 동일해야 한다.
  • SELECT * 인 경우 %ROWTYPE을 사용하면 좀 더 효율적이다.
  • INTO절은 필수이며 BEGIN~END 사이에서 사용되는 SELECT는 반드시 한 건만 SELECT 되어야 한다. 한 건도 SELECT 되지 않는다면 ORA-01403(NO_DATA_FOUND) 오류가 발생하고 여러 건 SELECT 된다면 ORA-01422(TOO_MANY_ROWS) 오류가 발생한다.


[기본형식]

SELECT  select_list

INTO    변수명 or 레코드이름

FROM    table

WHERE   conditions


-- EMP 테이블에서 이름을 입력받아 해당 사원의 급여 및 입사일자를 표시

SQL> edit ojc14


set serveroutput on

create or replace procedure ojc14

(v_ename in emp.ename%type)

is

v_sal emp.sal%type;

v_hiredate emp.hiredate%type;

begin

select sal, hiredate

into v_sal, v_hiredate

from emp

where ename = v_ename;

  

dbms_output.put_line('급여 : '||to_char(v_sal,'999,999'));

dbms_output.put_line('입사일자 : '||to_char(v_hiredate, 'yyyy.mm.dd'));

end;

/


SQL> @ojc14

프로시저가 생성되었습니다.


SQL> exec ojc14('SMITH')

급여 :    4,500

입사일자 : 1980.12.17



-- SELECT 예외 처리예제

SQL> set serveroutput on

SQL> create or replace procedure ojc15

    (v_sal in emp.sal%type)

    is

       v_ename emp.ename%type;

       v_hiredate emp.hiredate%type;

    begin

       select ename, hiredate

       into v_ename, v_hiredate

       from emp

      where sal = v_sal;

 

      dbms_output.put_line('이름 : '||v_ename);

      dbms_output.put_line('입사일자 : '||to_char(v_hiredate, 'yyyy.mm.dd'));

   end;

   /


프로시저가 생성되었습니다.


SQL> exec ojc15(950);

이름 : JAMES

입사일자 : 1981.12.03


SQL> exec ojc15(1250);

BEGIN ojc15(1250); END;

*

1행에 오류:

ORA-01422: 실제 인출은 요구된 것보다 많은 수의 행을 추출합니다

ORA-06512: "SCOTT.OJC15",  7행

ORA-06512:  1행


-- 예외처리 예문

SQL> set serveroutput on

SQL> create or replace procedure ojc15

    (v_sal in emp.sal%type)

    is

       v_ename emp.ename%type;

       v_hiredate emp.hiredate%type;

    begin

       select ename, hiredate

       into v_ename, v_hiredate

       from emp

      where sal = v_sal;

 

      dbms_output.put_line('이름 : '||v_ename);

      dbms_output.put_line('입사일자 : '||to_char(v_hiredate, 'yyyy.mm.dd'));

 

   exception

     when too_many_rows then

       dbms_output.put_line('데이터가 여러건 추출 되었습니다.');

     when no_data_found then

       dbms_output.put_line('데이터가 한건도 없습니다.');

     when others then

      dbms_output.put_line('SQL ERROR CODE : ' || SQLCODE);

      dbms_output.put_line('SQL ERROR MSG  : ' || SQLERRM);

   end;

   /


프로시저가 생성되었습니다.


SQL> exec ojc15(1250)

데이터가 여러건 추출 되었습니다.


SQL> exec ojc15(9999)

데이터가 한건도 없습니다.



#PL/SQL, #SELECT, #SELECT예외처리, #too_many_rows , #no_data_found, #PLSQL동영상, #오라클교육, #자바학원, #오라클학원, #자바교육, PL/SQL, SELECT, SELECT예외처리, too_many_rows , no_data_found, PLSQL동영상, 오라클교육, 자바학원, 오라클학원, 자바교육, 




(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...