레이블이 오라클패키지인 게시물을 표시합니다. 모든 게시물 표시
레이블이 오라클패키지인 게시물을 표시합니다. 모든 게시물 표시

2022년 1월 7일 금요일

DBMS_SQL패키지,OPEN_CURSOR, PARSE, EXECUTE, 동적SQL, 커서, DDL실습, Dynamic SQL실습,오라클교육, SQL교육, 오라클학원, SQL학원

 

DBMS_SQL패키지,OPEN_CURSOR, PARSE, EXECUTE, 동적SQL, 커서, DDL실습, Dynamic SQL실습,오라클교육, SQL교육, 오라클학원, SQL학원


https://www.youtube.com/watch?v=tO4rkJAC7FM&list=PLxU-iZCqT52CfP98Y4gCDKIm52tKvgy36&index=40 

http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=728 


DBMS_SQL패키지,OPEN_CURSOR, PARSE, EXECUTE, 동적SQL, 커서, DDL실습, Dynamic SQL실습,오라클교육, SQL교육, 오

DBMS_SQL패키지,OPEN_CURSOR, PARSE, EXECUTE, 동적SQL, 커서, DDL실습, Dynamic SQL실습,오라클교육, SQL교육, 오라클학원, SQL학원오라클 PL/SQLDBMS_SQL 패키지란?DDL, 동적SQL실습DBMS_SQLDBMS_SQL 패키지는 동적 SQL을 사

ojc.asia

https://www.youtube.com/watch?v=fYfTQruthLA&list=PLxU-iZCqT52CfP98Y4gCDKIm52tKvgy36&index=37 


오라클 PL/SQL


DBMS_SQL 패키지란?

DDL, 동적SQL


실습




 

DBMS_SQL


  • DBMS_SQL 패키지는 동적 SQL을 사용하여 DML(데이터 조작 언어) 또는 DDL(데이터 정의 언어) 문을 구문 분석할 수 있는 인터페이스를 제공한다.


  • DBMS_SQL 패키지의 PARSE 프로시저를 사용하여 SQL 구문을 파싱하며, DDL의 경우 별도의 EXECUTE 프로시저를 호출하지 않아도 된다.


  • EXECUTE 프로시저는 처리된 건수를 리턴하는데, INSERT, UPDATE 및 DELETE 문에 대해서만 유효하다. DDL을 포함한 다른 유형의 문의 경우 반환 값은 정의되지 않으므로 무시해야 한다.


 

[실습1 : DBMS_SQL 패키지를 이용하여 테이블 생성여부 확인 후 테이블 삭제 및 생성]


CREATE OR REPLACE PROCEDURE DBMS_SQL_TEST 

AS

    cursor_id INTEGER;

    rows_processed INTEGER;

    v_cnt NUMBER;

BEGIN

    cursor_id := DBMS_SQL.OPEN_CURSOR;

    

    SELECT COUNT(*) INTO v_cnt FROM user_tables WHERE table_name = 'TEST';

    IF v_cnt > 0 THEN

       DBMS_SQL.PARSE(cursor_id, 'drop table test', DBMS_SQL.NATIVE);

       rows_processed := DBMS_SQL.EXECUTE(cursor_id);

               -- v6 또는 0 : 버전6, v7 또는 2 : 버전7, NATIVE 또는 1 : 연결된 데이터베이스의 정상적인 동작을 지정

       DBMS_SQL.PARSE(cursor_id, 'create table test ( id number, name varchar2(20)) ', DBMS_SQL.NATIVE);

       rows_processed := DBMS_SQL.EXECUTE(cursor_id);

       

       DBMS_OUTPUT.PUT_LINE('삭제 후 생성');

    ELSE

       DBMS_SQL.PARSE(cursor_id, 'create table test ( id number, name varchar2(20)) ', DBMS_SQL.NATIVE);

       rows_processed := DBMS_SQL.EXECUTE(cursor_id);

       DBMS_OUTPUT.PUT_LINE('생성');

    END IF;   

    

EXCEPTION

WHEN OTHERS THEN

    DBMS_SQL.CLOSE_CURSOR(cursor_id);

    DBMS_OUTPUT.PUT_LINE(SQLERRM);

END;


set serveroutput on

exec dbms_sql_test;

select * from test;

drop table test; 



[실습2 : DBMS_SQL 패키지를 이용하여 동적SQL 커서 생성 후 FETCH]

-- 아래 예제는 EMP 테이블에서 입력한 부서코드의 사원을 출력하는 예제이다.

-- DBMS_SQL 패키지를 이용하여 커서를 생성하고 FETCH후 출력

 CREATE OR REPLACE PROCEDURE GETEMPS(P_DEPTNO IN NUMBER)

AS

   V_SQL           VARCHAR2(1000);

   V_CURSOR        INTEGER;

   V_AFFECTED_ROWS INTEGER;

   V_EMPNO         EMP.EMPNO%TYPE;

   V_ENAME         EMP.ENAME%TYPE;

BEGIN

     -- SQL문을 처리하려면 열린 커서가 있어야 하는데 OPEN_CURSOR함수를 사용, 커서ID를 리턴

     V_CURSOR := DBMS_SQL.OPEN_CURSOR;


     V_SQL := 'SELECT ename, sal FROM emp WHERE deptno = :d';


     -- Dynamic SQL문 파싱

     DBMS_SQL.PARSE(V_CURSOR, V_SQL, DBMS_SQL.NATIVE);


     -- 바인드변수 바인딩

     DBMS_SQL.BIND_VARIABLE(V_CURSOR, 'd', P_DEPTNO);


     -- CURSOR로부터 추출된 칼럼의 값을 받는 변수 지정

     -- 커서명, 상대위치, 받을변수명 ,길이 지정

     DBMS_SQL.DEFINE_COLUMN (V_CURSOR, 1, V_EMPNO);

     DBMS_SQL.DEFINE_COLUMN (V_CURSOR, 2, V_ENAME, 20);


     -- SQL문 실행

     V_AFFECTED_ROWS := DBMS_SQL.EXECUTE(V_CURSOR);

     DBMS_OUTPUT.PUT_LINE('V_AFFECTED_ROWS : ' || V_AFFECTED_ROWS);


     -- CURSOR에서 데이터 추출

    WHILE(DBMS_SQL.FETCH_ROWS(V_CURSOR) > 0)

    LOOP

        -- FETCH 결과를 변수에 저장

        DBMS_SQL.COLUMN_VALUE(V_CURSOR,1,V_EMPNO);

        DBMS_SQL.COLUMN_VALUE(V_CURSOR,2,V_ENAME);


        DBMS_OUTPUT.PUT_LINE('EMPNO :' || V_EMPNO || 'ENAME : '|| V_ENAME);

    END LOOP;


    DBMS_SQL.CLOSE_CURSOR(V_CURSOR);

EXCEPTION

   WHEN OTHERS THEN

       IF DBMS_SQL.IS_OPEN(V_CURSOR) THEN

         DBMS_SQL.CLOSE_CURSOR(V_CURSOR);

       END IF;

END;

/


SET SERVEROUTPUT ON;

EXEC GETEMPS(20);




#DBMS_SQL, #오라클패키지,#OPEN_CURSOR, #동적SQL, #오라클커서, #오라클DDL, #동적SQL, #SQL실습,#오라클교육, #SQL교육, #오라클학원, #SQL학원, DBMS_SQL, 오라클패키지,OPEN_CURSOR, 동적SQL, 오라클커서, 오라클DDL, 동적SQL, SQL실습,오라클교육, SQL교육, 오라클학원, SQL학원, 

2021년 12월 28일 화요일

오라클 패키지(Oracle Package) 실습 동영상, One Time Only Procedure, 오라클교육/오라클학원/ORACLE교육/ORACLE학원/자바교육/JAVA학원/자바동영상

 

오라클 패키지(Oracle Package) 실습 동영상, One Time Only Procedure, 오라클교육/오라클학원/ORACLE교육/ORACLE학원/자바교육/JAVA학원/자바동영상

http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=718 


오라클 패키지(Oracle Package) 실습 동영상, One Time Only Procedure, 오라클교육/오라클학원/ORACLE교육/ORAC

오라클 패키지(Oracle Package) 실습 동영상, One Time Only Procedure, 오라클교육/오라클학원/ORACLE교육/ORACLE학원/자바교육/JAVA학원오라클 PL/SQL오라클 패키지 실습ONE TIME ONLY PROCEDURE란?강의 : 이종철ONE TIME

ojc.asia

http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=717 


오라클 PLSQL, 전위적 선언(Forward Declaration), ORACLE 패키지, SQL교육, 오라클교육, 자바교육, 자바학원

오라클 PLSQL, 전위적 선언(Forward Declaration), ORACLE 패키지, SQL교육, 오라클교육, 자바교육, 자바학원오라클 PL/SQL전위적 선언(Forward Declaration)이종철동일한 PL/SQL블록에 여러 개의 Sub Program들이 올 수

ojc.asia


https://www.youtube.com/watch?v=EZl9trYM1HM&list=PLxU-iZCqT52CfP98Y4gCDKIm52tKvgy36&index=23 

https://www.youtube.com/watch?v=qIQOpqpNzpA&list=PLxU-iZCqT52CfP98Y4gCDKIm52tKvgy36&index=24 

https://www.youtube.com/watch?v=Ub3XCyENie0&list=PLxU-iZCqT52CfP98Y4gCDKIm52tKvgy36&index=25 


오라클 PL/SQL



오라클 패키지 실습

ONE TIME ONLY PROCEDURE란?


강의 : 이종철




ONE TIME ONLY PROCEDURE


  • 객체지향 프로그래밍의 초기화블록 처럼 패키지에서도 초기화 블록이 존재하는데 패키지내 함수나 프로시저가 최초 호출될 때 딱한번 호출되는 BEGIN~END 절을 만들 수 있는데 이를 One Time Only 프로시저라고 하고 주로 패키지내에서의 데이터 초기화 작업을 수행 합니다.
  • 패키지 바디의 맨 뒤쪽에 기술한다.


-- 이번에는 좀더 복잡한 패키지를 만들어 보자.


SQL> create table emp_log (

    log_date date,

    log_user varchar2(50),

    program varchar2(50)

    );


테이블이 생성되었습니다.


SQL> CREATE OR REPLACE PACKAGE emp_pkg AS

   /* 외부에서 접근가능한 TYPE, CURSOR, EXCEPTION */

   TYPE EmpRecType  IS RECORD (ename emp.ename%TYPE, sal emp.sal%TYPE);


 CURSOR desc_sal  RETURN EmpRecType;  -- 커서를 패치할 때 EmpRecType으로 받아야 함


   /* emp 테이블의 insert 건수를 기록, 전역변수 */

   insert_cnt NUMBER;


   /* 외부에서 호출 가능한 서브 프로그램들 */

   FUNCTION insert_emp (

      p_ename  emp.ename%TYPE,

      p_sal    emp.sal%TYPE,

      p_deptno dept.deptno%TYPE) RETURN emp.empno%TYPE;

   PROCEDURE fire_emp (p_empno emp.empno%TYPE);

   FUNCTION  nth_highest_sal (p_rank NUMBER) RETURN EmpRecType;

END emp_pkg;

/

패키지가 생성되었습니다.


SQL>  CREATE OR REPLACE PACKAGE BODY emp_pkg

   IS

      /* desc_sal 커서에 대한 구현부 */

      CURSOR desc_sal RETURN EmpRecType IS

         SELECT ename, sal FROM emp ORDER BY sal DESC;


      /* insert_emp 함수의 구현부 */

      FUNCTION insert_emp (

          p_ename  emp.ename%TYPE,

          p_sal    emp.sal%TYPE,

         p_deptno dept.deptno%TYPE) RETURN  emp.empno%TYPE

     IS

        new_empno NUMBER(5);

     BEGIN

        SELECT max(empno) + 1 into new_empno FROM EMP;

        INSERT INTO emp (empno, ename, sal, deptno)

             VALUES (

                      new_empno,

                      p_ename,

                      p_sal,

                      p_deptno

                    );

          COMMIT;

        insert_cnt := insert_cnt + 1;

        RETURN new_empno;

     END insert_emp;


     /*  fire_emp 프로시저 구현부 */

     PROCEDURE fire_emp (p_empno emp.empno%TYPE)

     IS

     BEGIN

        DELETE FROM emp WHERE empno = p_empno;

        COMMIT;

     END fire_emp;


     /* nth_highest_salary함수 구현부

        급여 순위 몇번째에 해당 하는 사원 리턴 */

     FUNCTION nth_highest_sal (p_rank NUMBER) RETURN EmpRecType

     IS

        --커서가 리턴하는 EmpRecType을 받기위한 변수

        emp_rec EmpRecType;  

     BEGIN

        OPEN desc_sal;  --패키지에서 정의한 전역커서 사용

        FOR i IN 1..p_rank LOOP

           -- 커서의 리턴형이 EmpRecType이므로,

           FETCH desc_sal INTO emp_rec; END LOOP;

        CLOSE desc_sal;

        RETURN emp_rec;

     END nth_highest_sal;


  -- 패키지가 최초 호출될 때 한번만 호출

  -- one time only procedure

  BEGIN

     INSERT INTO emp_log VALUES (SYSDATE, USER, 'EMP_PKG');

     COMMIT;

     insert_cnt := 0;

END emp_pkg;

  /

패키지 본문이 생성되었습니다.


SQL> variable empno number

SQL> exec :empno := emp_pkg.insert_emp('이종철',9990, 30)

PL/SQL 처리가 정상적으로 완료되었습니다.


SQL> print empno


     EMPNO

----------

     10000


SQL> exec emp_pkg.fire_emp(10000)

PL/SQL 처리가 정상적으로 완료되었습니다.


SQL> select empno, ename from emp where empno = 10000;

선택된 레코드가 없습니다.


SQL> set serveroutput on

SQL> DECLARE

    emp_rec emp_pkg.EmpRecType;

    BEGIN

       emp_rec := emp_pkg.nth_highest_sal(1);

       dbms_output.put_line('급여 최고높은 사원 :' || emp_rec.ename);

    END;

    /

급여 최고높은 사원 :오라클자바커뮤니티


SQL> BEGIN

    DBMS_OUTPUT.PUT_LINE('insert 건수 :' || emp_pkg.insert_cnt);

    END;

    /

insert 건수 :1


SQL>  select * from emp_log;


LOG_DATE LOG_USER                                           PROGRAM

-------- -------------------------------------------------- --------


16/01/01 SCOTT                      



#오라클, #패키지실습, #오라클패키지, #오라클동영상, #OneTimeOnlyProcedure, #오라클교육, #오라클학원, #ORACLE교육, #ORACLE학원, #자바교육, #JAVA학원,#패키지실습, 오라클,오라클패키지, 오라클동영상, OneTimeOnlyProcedure, 오라클교육, 오라클학원, ORACLE교육, ORACLE학원, 자바교육, JAVA학원

(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...