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