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

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 명시적커서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교육, 오라클학원, 오라클교육, 오라클동영상, 자바학원, 자바교육,  

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