2016-12-22 7 views
0

さて、私たちはこのように、テーブルゲームを持っているとしましょう:配列の内容がテーブル内にあるかどうかをチェックする方法は?

CREATE TABLE games(
    game_name NVARCHAR2(20), 
    owner NVARCHAR2(30), 
    purchase DATE 
); 

そして、このような「アレイ」:

CREATE TYPE array_ch1 IS OBJECT (game_name NVARCHAR2(20),purchase DATE); 
/

CREATE TYPE array_ch2 IS TABLE OF array_ch1; 
/

そして、そのアレイ上GTA」のような値が存在することになります'、' 2019 '、'パックマン '、' 2000 '

私は、与えられた日付にすべてのゲームを持つすべての所有者を返すプロシージャを作成しようとしていました。

私はすでに(それ以外の場合は、その所有者がゲームを持っており、右の購入日であれば1 0)与えられたワンオーナーと型の変数「array_ch1」は1または0を返すことを、「checkGame」と呼ばれる機能を持っています。

私の元のアイデアは、テーブルゲームと配列を同時に繰り返し、特定のユーザーが実際に正しい日付のゲームを実際に持っていたかどうかを確認することでしたが、結果を返す方法はわかりません。基準に合致する複数の所有者が存在する場合の対処法もありません。

CREATE OR REPLACE PROCEDURE findOwners(game_date IN array_ch2, good_owners OUT SYS_REFCURSOR) 
IS BEGIN 
    FOR v_game in SELECT * FROM games LOOP 
     FOR cond in 1..game_date.count LOOP 
      IF(checkGame(cond, v_game.owner) = 0) THEN 
       EXIT; 
      END IF; 
     END; 
    END; 
END; 
/
+0

データを一度に2か所に配置する目的は何ですか? –

+0

アイデアは、ユーザーが(別のソフトウェアを通じて)自分の基準に合ったゲームを探していたということです@BobJarvis、別の方法でこの種の入力を受け取るべきでしょうか? – Safirah

+0

私の主張は、あなたのデータを2つの場所に持つことは悪い考えです。データをデータベースに保存し、作業に取り入れ、完了したら元に戻します。 –

答えて

2

あなたのテーブル型array_ch2は、クエリで使用することができますように私はちょうど、SQLクエリを使用します。サンプルデータで

create table games(
    game_name NVARCHAR2(20), 
    owner NVARCHAR2(30), 
    purchase DATE 
); 

CREATE TYPE array_ch1 IS OBJECT (game_name NVARCHAR2(20),purchase DATE); 
/

CREATE TYPE array_ch2 IS TABLE OF array_ch1; 
/
insert into games values('Pacman', 'A', sysdate-300); 
/
insert into games values('Pacman', 'A', sysdate-250); 
/
insert into games values('GTA', 'A', sysdate-250); 
/
insert into games values('Pacman', 'B', sysdate-2); 
/
insert into games values('GTA', 'B', sysdate-1); 
/
insert into games values('Pacman', 'C', sysdate-300); 
/
insert into games values('Pacman', 'C', sysdate-400); 
/
commit 
/


declare 
    game1 array_ch1:=array_ch1('Pacman', sysdate-100); 
    game2 array_ch1:=array_ch1('GTA', sysdate-200); 
    tgames array_ch2:=array_ch2(game1, game2); 
    v_count pls_integer:=2; 
    c_result sys_refcursor; 
begin 
    open c_result for 
     select games.owner 
     from games, 
      table(tgames) tgames 
     where games.game_name=tgames.game_name 
     and games.purchase<=tgames.purchase 
     group by owner 
     having count(distinct games.game_name)=v_count; 
end; 

、唯一のAはで両方のゲームを有するので、条件を満たしています希望の時間、Bは両方のゲームを持っていますが、希望の時間の後、Cは同じゲームの2つを持っています。

関連する問題