web-dev-qa-db-ja.com

plsql Oracle10gで多くの行を返します

私は小さなプロジェクトをやっていて、多くの行を返すにはplsqlを実行する必要があります。

私は次のようなものがあります:

Table(id, data1, data2, from)

そして、ユーザーはfromの値を私に与えて、それをすべて返さなければなりません。

SQLは簡単です。

SELECT * FROM Table WHERE from = dataIntroduced

しかし、私はplsqlがそれを返す方法を知りません。

コレクションについて読みましたが、必要なものではないと思います

2
nax

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'))
/
3
Ryan Kenning

最も簡単な方法は、カーソルを返すことです。何かのようなもの

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ロジックをクエリ自体に埋め込む必要がある場合は、パイプラインテーブル関数が大好きです。ただし、単純なクエリを実行して結果を返すだけの場合は、やりすぎです。

1
Justin Cave