database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40884 게시물 읽기
No. 40884
PL/SQL에서 TABLE명을 변수로 받아서 CURSOR 실행법..?
작성자
초보자
작성일
2015-07-30 10:38
조회수
8,052

PL/SQL 짜다가 궁금한게 있어서 질문 올려봅니다.

 DECLARE

    V_TABLENAME VARCHAR2(1000);

CURSOR CUR1 IS

    SELECT * FROM EMP;

BEGIN

    FOR CUR_FOR IN CUR1 LOOP

        XXXXX;

   END FOR;

END;

 

이렇게 있을 때 SELECT * FROM EMP에서 EMP를 V_TABLENAME 변수로 설정해놓은 값을 사용하고 싶습니다.

SQL문 자체를 변수에 담는거 까지는 알겠는데

EXECUTE IMMEDIATE 를 사용하면 CURSOR가 안되는거 같습니다.

OPEN CUR FOR V_SQL 이런식으로 하는것도 같은데 자꾸 에러가 나네요. 도와주세요 ㅠ

 

이 글에 대한 댓글이 총 3건 있습니다.

DECLARE
    v_tablename  VARCHAR2(100);
    v_sql        VARCHAR2(1000);
    v_empno      emp.empno%TYPE;
    emp_row      emp%ROWTYPE;
    TYPE ref_cur IS REF CURSOR;
    cur1         ref_cur;
BEGIN
    v_tablename := 'emp';
    v_sql := 'SELECT * FROM ' || v_tablename || ' WHERE empno = :v_empno';
    v_empno := 7788;
    OPEN cur1 FOR v_sql USING v_empno;
    LOOP
        FETCH cur1 INTO emp_row;
        EXIT WHEN cur1%NOTFOUND;
        dbms_output.put_line(emp_row.ename);
    END LOOP;
    CLOSE cur1;
END;
/

마농(manon94)님이 2015-07-30 11:38에 작성한 댓글입니다.

 마농님 감사합니다. 점심은 잘 드셨는지요?

한가지 질문을 더 드리자면 

V_SQL 이 특정 테이블 ROW를 반환하는게 아니라 두 개이상의 테이블 조인으로 인해 생기는

복합 컬럼이 OUTPUT 일 경우에는 EMP_ROW를 어떻게 선언해야 되나요?

 

초보자님이 2015-07-30 12:36에 작성한 댓글입니다. Edit

DECLARE
    v_tablename  VARCHAR2(100);
    v_sql        VARCHAR2(1000);
    v_empno      emp.empno%TYPE;
    TYPE result_type IS RECORD( empno NUMBER
                              , ename VARCHAR2(30)
                              , dname VARCHAR2(30)
                              );
    result_set   result_type;
    TYPE ref_cur IS REF CURSOR;
    cur1         ref_cur;
BEGIN
    v_tablename := 'emp';
    v_sql := 'SELECT e.empno, e.ename, d.dname';
    v_sql := v_sql || ' FROM ' || v_tablename || ' e, dept d';
    v_sql := v_sql || ' WHERE e.deptno = d.deptno AND e.empno = :v_empno';
    v_empno := 7788;
    OPEN cur1 FOR v_sql USING v_empno;
    LOOP
        FETCH cur1 INTO result_set;
        EXIT WHEN cur1%NOTFOUND;
        dbms_output.put_line(result_set.ename || '-' || result_set.dname);
    END LOOP;
    CLOSE cur1;
END;
/

마농(manon94)님이 2015-07-30 13:27에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40887계층구조 데이터 구해오기[내용수정] [2]
초보
2015-07-31
8029
40886잘 이해가 안되는 SQL 결과에 대하여 질문을 드립니다. [3]
김흥수
2015-07-31
7880
40885SQL 좀 봐주세요. [2]
이현정
2015-07-30
8343
40884PL/SQL에서 TABLE명을 변수로 받아서 CURSOR 실행법..? [3]
초보자
2015-07-30
8052
40883특정 문자를 제거 후 (하이픈) 데이타 출력 방법 좀 알려 주세요. [2]
밥님
2015-07-29
7869
40882오라클 특수문자 깨짐 [1]
shrek
2015-07-28
23259
40881그룹핑 문제 입니다. 도와주시면 감사하겠습니다. [2]
2015-07-28
7858
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.025초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다