커서사용시 컬럼명을 동적으로 사용하기 1 2 1,317

by 귀차누 [PL/SQL] 커서 [2017.02.06 16:16:36]


안녕하세요! 구글링하다가 도저히 안나와서 이런게 정말 안되는건지 싶어서 문의 드립니다.

현재 오라킬 11g를 사용중입니다.

CUR(커서) A01(필드명)일때 CUR.A01 이렇게 컬럼을 조회하는데

이걸 동적으로 colName(변수) colName := 'A01'; colVal := CUR.getColVal(colName); 이런식으로 컬럼명을 변수로 받아 사용하고 싶은데 불가능한건가여?

by jkson [2017.02.06 17:00:36]
colVAl := CASE WHEN colName = 'A01' THEN CUR.A01 
               WHEN colName = 'A02' THEN CUR.A02
               ..
               ..
          END;

이렇게 하시면 안 될까요?
어떤 이유 때문에 이렇게 사용하시려는지 설명해주시면 더 좋은 방법을 다른 분이 적어주실 것 같네요.


by 마농 [2017.02.06 18:29:19]
DECLARE
    c_            NUMBER;
    x_            NUMBER;
    col_count_    NUMBER;
    col_position_ NUMBER;
    v_sql         VARCHAR2(100);
    col_name      VARCHAR2(100);
    col_value     VARCHAR2(100);
    desc_tab_     DBMS_SQL.DESC_TAB;
BEGIN
    col_name := 'ENAME';
    v_sql    := 'SELECT * FROM emp';
    c_       := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(c_, v_sql, dbms_sql.v7);
    DBMS_SQL.DESCRIBE_COLUMNS(c_, col_count_, desc_tab_);
    FOR i_ IN 1..col_count_
    LOOP
        IF desc_tab_(i_).col_name = col_name THEN
            col_position_ := i_;
            EXIT;
        END IF;
    END LOOP;
    IF col_position_ > 0 THEN
        DBMS_SQL.DEFINE_COLUMN(c_, col_position_, col_value, 100);
        x_ := DBMS_SQL.EXECUTE(c_);
        DBMS_OUTPUT.PUT_LINE(col_name);
        DBMS_OUTPUT.PUT_LINE('------');
        LOOP
            EXIT WHEN DBMS_SQL.FETCH_ROWS(c_) = 0;
            DBMS_SQL.COLUMN_VALUE(c_, col_position_, col_value);
            DBMS_OUTPUT.PUT_LINE(col_value);
        END LOOP;
    ELSE
        DBMS_OUTPUT.PUT_LINE('col_name 오류 : ' || col_name);
    END IF;
    DBMS_SQL.CLOSE_CURSOR(c_);
END;
/

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입