2017-01-17 3 views
0

プロシージャから特定の列の値を戻す最適な方法は何ですか。私はSELECT *を使用している場合たとえば、以下のコードは、私がこれを取得するための手順を使用する方法についての運動であると仮定し...それは動作しますが、同じシナリオでOracle PL/SQL:プロシージャから特定の選択した列を戻す

+0

あなたはTABLE1に対応するレコードのテーブルとしてデータを宣言しました。 select文は、table1から2列、table2から1列を選択します。 – DCookie

+0

一般的なSQLで必要なことを行うことができれば、なぜ最初にプロシージャが必要ですか? (私は、非常に頻繁に人々がPL/SQLを使用する必要がないときに使用するので尋ねます) – mathguy

答えて

2

/*DECLARATION*/ 
TYPE t_data IS TABLE OF Table1%ROWTYPE; 

PROCEDURE get_values(data OUT t_data) AS  
    BEGIN  
    SELECT a.object_id, a.num, b.descrip 
     BULK COLLECT INTO data 
     FROM Table1 a INNER JOIN 
      Table2 b ON (a.id = b.id) 
    WHERE a.date IS NULL;     
    END get_values; 

を動作しません。構造化された値のリスト。可能であれば、純粋なSQLメソッドを優先して、テーブルからデータを取得するようなアプローチは決してお勧めしません。

あなたはこれらのようなテーブルを持っているように見える:

create table table1(id ,object_id, num, "date") as (
    select 1, 1, 100, sysdate from dual union all 
    select 2, 2, 200, null from dual 
); 
create table table2(id, descrip) as (
    select 1, 'desc1' from dual union all 
    select 2, 'desc2' from dual 
); 

あなたは、各行が、両方のテーブルからの要素が含まれている行のセットを返すプロシージャを作成しようとしています。そのためには、選択したクエリの結果と一致する型を作成する必要があります。

あなたはこのようなあなたのパッケージを定義することもできます。

CREATE OR REPLACE PACKAGE yourPackage AS 
    TYPE tRec IS RECORD /* made to match the columns you want to extract in your query */ 
    (
     object_id        NUMBER, 
     num          NUMBER, 
     descrip         VARCHAR2(100) 
    ); 

    TYPE tTab IS TABLE OF tRec; 

    PROCEDURE get_values(data OUT tTab); 
END yourPackage; 
create or replace package body yourPackage as 
PROCEDURE get_values(data OUT tTab) AS  
    BEGIN  
    SELECT a.object_id, a.num, b.descrip 
     BULK COLLECT INTO data 
     FROM Table1 a INNER JOIN 
      Table2 b ON (a.id = b.id) 
    WHERE a."date" IS NULL;     
    END get_values; 
end yourPackage ; 

あなたは、パッケージにこの方法の手順を呼び出すことができます。

declare 
    someVar yourPackage.tTab; 
begin 
    yourPackage.get_values(someVar); 
    -- 
    if someVar.first is not null then 
     for i in someVar.first .. someVar.last loop 
      dbms_output.put_line(someVar(i).object_id || ' - ' || someVar(i).num || ' - ' || someVar(i).descrip); 
     end loop; 
    end if; 
end; 

を、これはあなたが得る結果である:

2 - 200 - desc2 
+0

優れています。それはまさに私が探していたものでしたありがとう! –

0

Typeのいずれも最初に作成することはできません。table%rowtype PLSQLブロックobjectという表を作成してから、type of that objectを作成する必要があります。その後、それを使用することができます。

は、以下を参照してください。

CREATE OR REPLACE TYPE Table11 AS OBJECT 
(
    id NUMBER, 
    num NUMBER, 
    description VARCHAR2 (20) 
) 

CREATE OR REPLACE TYPE t_data IS TABLE OF Table11; 

CREATE OR REPLACE PROCEDURE get_values (v_data OUT t_data) 
AS 
BEGIN 

    SELECT Table11 (a.row_id, 222, 'hello') 
    BULK COLLECT INTO v_data 
    FROM Table1 a INNER JOIN Table2 b 
    ON (a.row_id = b.appid) 
    WHERE a.date IS NULL; 

END get_values; 

を実行:

DECLARE 
    v_var t_data; 
BEGIN 
    get_values (v_var); 

    FOR i IN 1 .. v_var.COUNT 
    LOOP 
     DBMS_OUTPUT.put_line (v_var (i).id ||' ' ||v_var(i).num ||' ' || v_var(i).description); 
    END LOOP; 
END; 

出力:

SQL>/
1 222 hello 
2 222 hello 

PL/SQL procedure successfully completed. 
関連する問題