私は小さなプロジェクトをやっていて、多くの行を返すにはplsqlを実行する必要があります。
私は次のようなものがあります:
Table(id, data1, data2, from)
そして、ユーザーはfromの値を私に与えて、それをすべて返さなければなりません。
SQLは簡単です。
SELECT * FROM Table WHERE from = dataIntroduced
しかし、私はplsqlがそれを返す方法を知りません。
コレクションについて読みましたが、必要なものではないと思います
PL/SQLから選択データを返す1つの方法は、Oracle表関数を使用することです。以下は、行SELECT * FROM table_a where test_a = par1;
を選択ステートメントで置き換える+テーブル名を変更する例です。
Create table Table_a
(test_a varchar2(1))
/
insert into table_a
values('a')
/
create or replace package test_package as
TYPE col_table_1 is table of TABLE_A%ROWTYPE;
function test_plsql_table(par1 varchar2) return col_table_1
pipelined;
end;
/
create or replace package body test_package as
function test_plsql_table(par1 varchar2) return col_table_1
PIPELINED as
cursor temp_cur is
SELECT * FROM table_a where test_a = par1;
begin
for cur_rec in temp_cur loop
pipe row(cur_rec);
end loop;
end;
end;
/
SELECT * from TABLE( test_package.test_plsql_table('a'))
/
最も簡単な方法は、カーソルを返すことです。何かのようなもの
create or replace function get_emps_in_dept( p_dept_in IN number )
return sys_refcursor
is
l_ret sys_refcursor;
begin
open l_ret
for select *
from emp
where deptno = p_dept_in;
return l_ret;
end;
その後、ホスト変数を宣言することにより、SQL * Plusでそれを呼び出すことができます(ほとんどのフロントエンド言語は、カーソルを返すSELECT
ステートメントと同じようにSYS_REFCURSOR
を返す関数を扱います)
SQL> variable rc refcursor;
SQL> exec :rc := get_emps_in_dept( 30 );
PL/SQL procedure successfully completed.
SQL> print rc;
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO
----------
7499 ALLEN SALESMAN 7698 20-FEB-81 1601 300
30
7521 WARD SALESMAN 7698 22-FEB-81 1251 500
30
7654 MARTIN SALESMAN 7698 28-SEP-81 1251 1400
30
7698 BLAKE MANAGER 7839 01-MAY-81 2851
30
7844 TURNER SALESMAN 7698 08-SEP-81 1501 0
30
7900 JAMES CLERK 7698 03-DEC-81 951
30
6 rows selected.
すべてを一度に、またはパイプライン化してコレクションを返すことができますが、オブジェクトを作成および維持するにはさらにコードが必要です。 SQLで追跡するのが難しいPL/SQLロジックをクエリ自体に埋め込む必要がある場合は、パイプラインテーブル関数が大好きです。ただし、単純なクエリを実行して結果を返すだけの場合は、やりすぎです。