복붙노트

[SQL] 특정 컬럼이 SQL에서 호출 SYS_REFCURSOR 함수 반환

SQL

특정 컬럼이 SQL에서 호출 SYS_REFCURSOR 함수 반환

이것은 약간 바보 찾을 수 있습니다,하지만 난이 가능한지 알고 싶습니다.

나는 SYS_REFCURSOR를 반환하는 기능을 가지고

CREATE OR REPLACE FUNCTION get_employee_details(p_emp_no IN EMP.EMPNO%TYPE)
   RETURN SYS_REFCURSOR
AS
   o_cursor   SYS_REFCURSOR;
BEGIN
   OPEN o_cursor FOR
      SELECT EMPNO,
             ENAME,
             JOB,
             MGR,
             HIREDATE,
             SAL,
             COMM,
             DEPTNO
        FROM emp
       WHERE EMPNO = p_emp_no;

   RETURN o_cursor;
 -- exception part
END;
/

내가 사용하여 결과를 얻을 수

select  get_employee_details('7369') from dual;

그것은 열 이름을 지정하여 위의 함수에서 결과를 얻을 수 있습니까? 예를 들면 내가 ENAME 또는 급여를 얻고 싶은 것, 어떻게 내가 PLSQL 블록을 사용하지 않고 SQL 문에 지정할 수 있습니다? 같은 뭔가

select  get_employee_details('7369') <specific column> from dual;

해결법

  1. ==============================

    1.아니,이 예와 같이,로 수익을 캐스팅 SQL 유형을 생성하지 않고 심판 전혀 커서, 그렇지 않으면하지와 : http://dbaspot.com/oracle-server/9308-select-ref-cursor.html :

    아니,이 예와 같이,로 수익을 캐스팅 SQL 유형을 생성하지 않고 심판 전혀 커서, 그렇지 않으면하지와 : http://dbaspot.com/oracle-server/9308-select-ref-cursor.html :

    create or replace type myType as object (
    a int,
    b varchar2(10)
    )
    /
    
    create or replace type myTable as table of myType;
    /
    
    create or replace function f1 return myTable as
    l_data myTable := myTable();
    begin
    for i in 1 .. 5 loop
    l_data.extend;
    l_data(i) := myType(i, 'Row #'||i );
    end loop;
    return l_data;
    end;
    /
    
    select * from TABLE ( cast( f1() as myTable ) );
    
    ---------- ----------
    1 Row #1
    2 Row #2
    3 Row #3
    4 Row #4
    5 Row #5
    

    해당 스레드의 마지막 게시물에서 :

  2. ==============================

    2.이를 위해, 당신은 파이프 라인 기능을 살펴 할 수 있습니다. 당신은하지만 PL / SQL 수준에서 명시 적 유형을 선언해야합니다. 그 부분은 출력 열 이름을 설정한다 :

    이를 위해, 당신은 파이프 라인 기능을 살펴 할 수 있습니다. 당신은하지만 PL / SQL 수준에서 명시 적 유형을 선언해야합니다. 그 부분은 출력 열 이름을 설정한다 :

    CREATE OR REPLACE TYPE my_rec AS OBJECT (
      c CHAR,
      n NUMBER(1)
    );
    
    CREATE OR REPLACE TYPE my_tbl AS TABLE OF my_rec;
    

    이제 큰 장점은 단지 "이름 바꾸기"를 열하지만 너무 즉시 커서에서 레코드를 수정할 수 없습니다입니다. 예를 들어 :

    CREATE OR REPLACE FUNCTION my_fct
    RETURN my_tbl PIPELINED
    AS
      -- dummy data - use your own cursor here
      CURSOR data IS
          SELECT 'a' as A, 1 AS B FROM DUAL UNION 
          SELECT 'b', 2 FROM DUAL UNION 
          SELECT 'c', 3 FROM DUAL UNION 
          SELECT 'd', 4 FROM DUAL;
    BEGIN
      FOR the_row IN data
      LOOP 
          PIPE ROW(my_rec(the_row.a, the_row.b*2));
          --                                  ^^
          --                            Change data on the fly
      END LOOP;
    END
    

    용법:

    SELECT * FROM TABLE(my_fct())
    --            ^^^^^^^^^^^^^^^
    --     Use this "virtual" table like any
    --     other table. Supporting `WHERE`  clause
    --     or any other SELECT clause you want
    

    생산 :

    C   N
    a   2
    b   4
    c   6
    d   8
    
  3. from https://stackoverflow.com/questions/13690110/function-return-sys-refcursor-call-from-sql-with-specific-columns by cc-by-sa and MIT license