5

これはばかげているかもしれませんが、これが可能かどうか知りたいです。

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;
4

2 に答える 2

12

そのためには、関数を調べてみてくださいPIPELINED。ただし、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
于 2014-09-19T17:04:41.260 に答える
4

いいえ、まったくありません。ref cursorそれ以外の場合は、次の例のように、戻り値をキャストする 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

そのスレッドの最後の投稿から:

選択ステートメントで REF CURSOR を使用する唯一の方法は、既に知っている方法です。

于 2012-12-03T19:29:06.450 に答える