레이블이 오라클커서인 게시물을 표시합니다. 모든 게시물 표시
레이블이 오라클커서인 게시물을 표시합니다. 모든 게시물 표시

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월 25일 토요일

오라클 참조커서, RefCursor, 자바JDBC에서 오라클함수리턴값받기, SQL교육, SQL학원, 오라클교육, 오라클학원, 자바교육, 자바학원,JAVA학원

 

오라클 참조커서, RefCursor, 자바JDBC에서 오라클함수리턴값받기, SQL교육, SQL학원, 오라클교육, 오라클학원, 자바교육, 자바학원,JAVA학원


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


오라클 참조커서, RefCursor, 자바JDBC에서 오라클함수리턴값받기, SQL교육, SQL학원, 오라클교육, 오

오라클 참조커서, RefCursor, 자바JDBC에서 오라클함수리턴값받기, SQL교육, SQL학원, 오라클교육, 오라클학원, 자바교육, 자바학원오라클 PL/SQL참조커서(Ref Cursor)참조커서로 SELECT결과를 클라이언트로

ojc.asia

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

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

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

https://www.youtube.com/watch?v=8hc030THr8w&list=PLxU-iZCqT52CfP98Y4gCDKIm52tKvgy36&index=16 


오라클 PL/SQL



참조커서(Ref Cursor)

참조커서로 SELECT결과를 클라이언트로 리턴

자바JDBC에서 Ref Cursor로 리턴받기




참조커서(REF CURSOR)


  • 일반 커서는 정적이며 커서가 한번 SQL 영역을 가리키면 가리키는 곳을 변경 못한다. 하지만  참조커서(REF CURSOR)는 가능하다.



Declare
   Type refcur is ref cursor;
   cursor c is select * from dual;
   myCur refCur;
begin
  --myCur는 ref cursor
if (to_char(sysdate,'DY') = '일') then
    open myCur for select * from emp;
elsif (to_char(sysdate,'DY') != '일') then
    open myCur for select * from dept;
end if;
open c;  -- 일반커서
end;
/

  • 일반 커서가 가리키는 데이터는 함수나 프로시저를 호출한 곳으로 보낼 수 없지만 참조커서(REF CURSOR)가 가리키는 데이터는 가능하다.



-- 커서를 리턴할 수 있는 함수를 만든다. 

CREATE OR REPLACE FUNCTION emptest(v_deptno in number) RETURN SYS_REFCURSOR    AS

       test_cursor SYS_REFCURSOR;

       sql_string Varchar2(500);

BEGIN

       sql_string := 'Select empno, ename, sal from Emp where deptno = :deptno' ;

       Open test_cursor FOR sql_string USING v_deptno;

       RETURN test_cursor;

       CLOSE test_Cursor;

  END;

  /


variable a refcursor ;

exec :a := emptest(20) ;

print a;



EMPNO ENAME             SAL

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

      7566 JONES            2975

      7788 SCOTT            3000

      7876 ADAMS            1100

      7902 FORD             3000


-- JAVA/JSP등에서 확인


                Class.forName(driver_name); //jdbc 드라이버연결

                conn =  DriverManager.getConnection(url,user,pwd); //Connection인수 입력

               

                String proc_call = "{? = call emptest(?)}";

             

                // 오라클 함수 또는 프로시저를 호출하기 위해 callable statement를 이용

                CallableStatement cstmt = conn.prepareCall(proc_call);

 

                // key here is to register the output parameter

                // of type cursor, execute, then cast it as a ResultSet.

                -- emptest 함수의 output 파라미터 타입을 CURSOR로 한다.

                -- 첫번째  ?가 출력파라미터, 두번째 파리미터는 입력파라미터

                cstmt.registerOutParameter(1, OracleTypes.CURSOR);

                cstmt.setInt(2, 10);  //10번 부서의 데이터 얻기 위해

                cstmt.executeQuery();


                rs = (ResultSet)cstmt.getObject(1);

                while(rs.next()) {

                        out.println(rs.getString("ename") + "<br>");

                        ……

                }



#참조커서, #오라클참조커서, #RefCursor, #오라클커서, #커서란, #SQL교육, #SQL학원, #오라클학원, #오라클교육, #자바교육, #자바학원, #오라클동영상, 참조커서, 오라클참조커서, RefCursor, 오라클커서, 커서란, SQL교육, SQL학원, 오라클학원, 오라클교육, 자바교육, 자바학원, 오라클동영상, 
 

PLSQL 커서,파라미터커서,Parameterized Cursor실습,PL/SQL커서,학원공부도 좋지만혼자해보세요~오라클교육,자바교육,SQL교육, JAVA학원, SQL학원

 











오라클 PLSQL 커서, 파라미터커서, Parameterized Cursor실습, PL/SQL커서, 학원공부도 좋지만 혼자해보세요~오라클교육, 자바교육, SQL교육



오라클 PL/SQL



Parameterized 커서



실습




Parameterized 커서


  • Parameter를 받을 수 있는 커서, 외부의 입력값을 이용하여 커서를 만들 때 사용한다.


[실습]

Parameterized 커서를 이용하여 급여의 하한값과 상한값을 입력받아 사원의 이름과 급여를 출력하는 프로시저를 작성하세요.


set serveroutput on;

create or replace procedure printEmp(p_low_sal in number, p_high_sal in number)
is
    CURSOR c_emp (low_sal NUMBER, high_sal NUMBER)
    IS  SELECT ename, sal FROM emp
        WHERE sal BETWEEN low_sal AND high_sal;
    v_ename emp.ename%type;
    v_sal   emp.sal%type;
BEGIN    
    OPEN c_emp(p_low_sal, p_high_sal);
    LOOP
        FETCH c_emp INTO v_ename, v_sal;
        EXIT WHEN c_emp%notfound;
        dbms_output.put_line(v_ename || ': ' ||v_sal);
    END LOOP;    
    CLOSE c_emp;
END;
/

exec printEmp(2500, 5000);

JONES: 2975
BLAKE: 2850
CLARK: 2500
SCOTT: 3000
KING: 5000
FORD: 3000



[실습]

Parameterized 커서를 이용하여 부서 테이블에서 모든 부서를 순회하면서 부서원들의 이름을 출력하는 프로시저를 작성하세요.(DEPT, EMP 테이블용 2개의 커서를 사용)

set serveroutput on

create or replace procedure printDeptEmp
is
 CURSOR c_dept IS SELECT * FROM dept;
 CURSOR c_emp(p_deptno emp.deptno%TYPE) IS
     SELECT ename, sal FROM emp WHERE deptno = p_deptno;
BEGIN
  FOR dept IN c_dept LOOP
    DBMS_OUTPUT.PUT_LINE('=========================');
    DBMS_OUTPUT.PUT_LINE(dept.deptno|| ' :: ' || dept.dname);
      FOR emp_record IN c_emp (dept.deptno) LOOP
       DBMS_OUTPUT.PUT_LINE(emp_record.ename || ' , ' || emp_record.sal);
     END LOOP;
 END LOOP;
END;
/

exec printDeptEmp;

=========================
10 :: ACCOUNTING
CLARK , 2500
MILLER , 1360
=========================
20 :: RESEARCH
JONES , 2975
SCOTT , 3000
ADAMS , 1100
FORD , 3000
=========================
30 :: SALES
ALLEN , 1600
WARD , 1250
MARTIN , 1250
BLAKE , 2850
TURNER , 1500
JAMES , 950
=========================
40 :: OPERATIONS




#오라클, #PLSQL, #PLSQL커서, #파라미터커서, #ParameterizedCursor, #오라클커서, #오라클교육, #자바교육, #SQL교육, #자바학원, #오라클학원, #SQL학원, 오라클, PLSQL, PLSQL커서, 파라미터커서, ParameterizedCursor, 오라클커서, 오라클교육, 자바교육, SQL교육, 자바학원, 오라클학원, SQL학원, 



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