10

Oracle SQL プロシージャはテーブルを返すことができますか? 現在、ループ内にある 2 つのカーソルの出力を出力するためにa を使用してdbms_outputいますが、代わりに 2 つの列を返すと見栄えが良くなります。それは手順内で可能ですか?

4

3 に答える 3

14

PL/SQL 関数は、ネストした表を返すことができます。ネストされたテーブルを SQL 型として宣言すると、TABLE() 関数を使用してクエリのソースとして使用できます。

型と、それから作成されたネストされたテーブルを次に示します。

SQL> create or replace type emp_dets as object (
  2  empno number,
  3  ename varchar2(30),
  4  job varchar2(20));
  5  /

Type created.

SQL> create or replace type emp_dets_nt as table of emp_dets;
  2  /

Type created.

SQL> 

これは、そのネストされたテーブルを返す関数です...

create or replace function get_emp_dets (p_dno in emp.deptno%type)
    return emp_dets_nt
is
    return_value emp_dets_nt;
begin
    select emp_dets(empno, ename, job)
    bulk collect into return_value
    from emp
    where deptno = p_dno;
    return return_value;
end;
/

...そしてこれがどのように機能するかです:

SQL> select * 
  2  from table(get_emp_dets(10))
  3  /

     EMPNO ENAME                          JOB
---------- ------------------------------ --------------------
      7782 CLARK                          MANAGER
      7839 KING                           PRESIDENT
      7934 MILLER                         CLERK

SQL> 

SQL 型は多くの機能を提供し、PL/SQL で非常に洗練された API を構築できるようにします。 詳細をご覧ください

于 2012-12-02T21:05:49.100 に答える
0

これも役立つ場合があります。

DECLARE
  TYPE t_emptbl IS TABLE OF scott.emp%rowtype;
  v_emptbl t_emptbl; 
  ret_val  t_emptbl; 
  --
  Function getEmployeeList Return t_emptbl 
  IS
  BEGIN
    SELECT * bulk collect INTO v_emptbl FROM scott.emp;
    -- Print nested table of records:
    FOR i IN 1 .. v_emptbl.COUNT LOOP
      DBMS_OUTPUT.PUT_LINE (v_emptbl(i).empno);
    END LOOP;
    RETURN v_emptbl;
  END;
  --
  BEGIN
    ret_val:= getEmployeeList;
  END;
  /
于 2012-12-06T15:14:09.173 に答える