2011-01-20 6 views
1

私はそれが実行して、テーブルであるかのように、私はデータを返すためにそれを呼び出すことができるように、異なる次の手順を書きたい、この手順を書くことができます:SELECT * FROM table(package.get7DayCapacityDemandProv(1, sysdate))どのように違っ

Procesdure:

PROCEDURE get7DayCapacityDemandProv(p_H_id     IN  work_entity_data.H_id%TYPE 
            ,p_date       IN  DATE 
            ,p_capacity_day_1     OUT NUMBER 
            ,p_demand_day_1     OUT NUMBER 
            ,p_capacity_day_2     OUT NUMBER 
            ,p_demand_day_2     OUT NUMBER 
            ,p_capacity_day_3     OUT NUMBER 
            ,p_demand_day_3     OUT NUMBER 
            ,p_capacity_day_4     OUT NUMBER 
            ,p_demand_day_4     OUT NUMBER 
            ,p_capacity_day_5     OUT NUMBER 
            ,p_demand_day_5     OUT NUMBER 
            ,p_capacity_day_6     OUT NUMBER 
            ,p_demand_day_6     OUT NUMBER 
            ,p_capacity_day_7     OUT NUMBER 
            ,p_demand_day_7     OUT NUMBER 
            ) 
    IS 
    BEGIN 

    getCapacityDemandOnDayProvider(p_H_id 
            ,p_date 
            ,p_capacity_day_1 
            ,p_demand_day_1 
           ); 

    getCapacityDemandOnDayProvider(p_H_id 
            ,p_date + 1 
            ,p_capacity_day_2 
            ,p_demand_day_2 
           ); 

    getCapacityDemandOnDayProvider(p_H_id 
            ,p_date + 2 
            ,p_capacity_day_3 
            ,p_demand_day_3 
           ); 

    getCapacityDemandOnDayProvider(p_H_id 
            ,p_date + 3 
            ,p_capacity_day_4 
            ,p_demand_day_4 
           ); 

    getCapacityDemandOnDayProvider(p_H_id 
            ,p_date + 4 
            ,p_capacity_day_5 
            ,p_demand_day_5 
           ); 

    getCapacityDemandOnDayProvider(p_H_id 
            ,p_date + 5 
            ,p_capacity_day_6 
            ,p_demand_day_6 
           ); 

    getCapacityDemandOnDayProvider(p_H_id 
            ,p_date + 6 
            ,p_capacity_day_7 
            ,p_demand_day_7 
           ); 

    END get7DayCapacityDemandProv; 
+0

SELECTで14列の行を戻すか、あなたはそれが2列ごとに、毎日1つ、7行を返すようにしたいですか? –

+0

@dave edit:理想的には、3つのcolumsnと7つの行が必要です。列=日、能力、需要。行= day1、day2、day3など私はそれをグラフに入れることができます。そうでない場合は、あなたが考えることができるものは何でも私はちょうどプロシージャからそれを取得したいテーブルから選択することができます – code511788465541441

答えて

0

あなたは機能やビューが好きなように聞こえます。プロシージャーから返されたデータは、SQLスクリプト内で捕捉され使用されますが、最初にtempまたはvariableテーブルにダンプする必要があります。

あなたの必要条件がSELECT * FROM somethingの場合は、おそらく関数またはビューが必要です。

+0

はい、私はラッパー関数が必要です。あなたはこの特定の前提のために私がそれをどのように実装できるか知っていますか? – code511788465541441

1

これは袖口から外れているため、構文的には100%正しいとは言えませんが、概念的には正しいでしょう。

create or replace package bingo IS 
TYPE bingoCursor is REF CURSOR; 

function get7Days(
    bingoId IN bingoTable.bingoId%TYPE, 
    bingoDate IN date) 
    return bingoCursor; 
end bingo; 

create or replace package body bingo IS 

function get7Days(
    bingoId IN bingoTable.bingoId%TYPE, 
    bingoDate IN date) 
    return bingoCursor IS 

    sevenDaysContent bingoCursor; 
begin 
    open sevenDaysContent for 
     select day 1 stuff; 

     union all 

     select day 2 stuff; 

     union all 

     ... select and union all days 3 - day 7; 

    return sevenDaysContent; 
end get7Days; 
end bingo;
+0

私の手続きのどの部分が選択日xビットに入りますか?私は非常にplsqlに精通していない私はあなたの構文を使用して私の手続きで動作するようにもう少し正確にすることができます。ありがとう – code511788465541441

+0

getCapacityDemandOnDayProviderにはselect文が含まれている必要があります。 1日目の適切な入力値を持つselectステートメントを "select day 1 stuff"に置き換えます。 – DwB

+0

このプロシージャーは別のプロシージャーを呼び出し、多くの異なる関数を呼び出し、計算を行います。その結果、選択ステートメントをそこに置くことができます。 – code511788465541441

2

(1)これをレコードを返す関数に変換し、(2)パイプライン関数に変換します。

例を示します。私はちょうどので、私は簡単にそれを実行することができ、最初のパラメータを残しましたが、あなただけでその背中を追加することができます。

create or replace package test 
as 
    type theRecordType is record (
    day date, 
    capacity number, 
    demand number 
); 

    type theTableType is table of theRecordType; 

    function getData(p_date DATE) return theTableType pipelined; 
end test; 
/

create or replace package body test 
as 
    function getData(p_date DATE) return theTableType pipelined 
    as 
     theRecord theRecordType; 
    begin 
     for i in 0..6 loop 
     theRecord.date := p_date + i; 
     theRecord.capacity := i; 
     theRecord.demand := i+1; 
     -- 
     -- you would have a call to your procedure instead of the above two lines 
     --  getCapacityDemandOnDayProvider(p_H_id 
     --       ,theRecord.date 
     --       ,theRecord.capacity 
     --       ,theRecord.demand 
     --       ); 
     -- 
     pipe row (theRecord); 
     end loop; 
     return; 
    end getData; 
end test; 
/

あなたは今の機能から選択し、日ごとに1行を取得することができます。

タイプをパッケージヘッダ内で宣言できるようにパッケージ化しました。代わりに、スタンドアロンの関数を保持し、CREATE TYPEを使用してスキーマ内の型を宣言することもできます。

+0

greate – code511788465541441

+0

編集:問題があります。その結果、getCapacityDemandOnDayProviderを宣言しなければならないというエラーが表示されます。 – code511788465541441

+0

プロシージャ名のスペルが間違っている(正しいと思われます)か、パラメータのタイプが正しくありません(正しいタイプのp_H_idを宣言しましたか?パッケージをビルドしているスキーマにはプロシージャへのアクセス権がありません。 –

0

sys_refcursorを返す関数を作成できます。非常に単純な例:

create or replace function BLAH(somevar in varchar2) return sys_refcursor IS 
v_result_cur sys_refcursor; 
v_query varchar2(4000); 
... 
begin 
... 
v_query := 'select field1, field2 from blah'; 
... 
open v_result_cur for v_query; 
return v_result_cur; 
... 
exception 
... 
end; 

しかし、これは典型的ではないと言います。おそらく、ビュー(またはマテリアライズドビュー)を使用するか、それらの内部プロシージャを関数に変えて、単に次のように選択します。

select 
FN_getCapacityDemandOnDayProvider(someVars) as Day1Val, 
FN_getCapacityDemandOnDayProvider(someVars2) as Day2Val 
from dual; 
関連する問題