2016-12-22 7 views
0

Okay, lassen Sie uns sagen, dass wir ein Tischspiele haben, wie folgt aus:Wie überprüft man, ob sich der Inhalt eines Arrays in einer Tabelle befindet?

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

und ein „Array“ wie diese:

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

CREATE TYPE array_ch2 IS TABLE OF array_ch1; 
/

Und auf diesem Array würde es Werte wie ‚GTA sein ',' 2019 'und' Pac-man ',' 2000 '.

Ich habe versucht, eine Prozedur zu erstellen, die alle Besitzer zurückgibt, die alle Spiele in dem angegebenen Datum haben.

Ich habe bereits eine Funktion namens „checkGame“, dass angesichts einem Eigentümer und Variable vom Typ „array_ch1“ liefert 1 oder 0 (1, wenn die Besitzer das Spiel hat und am richtigen Kaufdatum, sonst 0) .

Meine ursprüngliche Idee war es, durch die Tabellenspiele und das Array gleichzeitig zu iterieren und zu überprüfen, ob ein bestimmter Benutzer tatsächlich das richtige Spiel mit dem richtigen Datum hatte, aber ich habe keine Ahnung, wie ich das Ergebnis zurückgeben soll. noch, was zu tun ist, wenn es mehrere Besitzer gibt, die den Kriterien entsprechen.

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

Was ist der Zweck, die Daten an zwei Orten gleichzeitig zu haben? –

+0

Die Idee war, dass Benutzer (durch eine andere Software) nach Spielen suchte, die ihren Kriterien entsprechen, @BobJarvis, vielleicht sollte ich diese Art von Eingabe auf eine andere Weise erhalten? – Safirah

+0

Mein Punkt ist, dass es eine schlechte Idee ist, Ihre Daten an zwei Stellen zu haben. Bewahren Sie Ihre Daten in der Datenbank auf, nehmen Sie sie heraus, um daran zu arbeiten, und legen Sie sie zurück, wenn Sie fertig sind. –

Antwort

2

Ich würde nur eine SQL-Abfrage verwenden, als Tabellentyp array_ch2 in einer Abfrage verwendet werden kann:

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; 

In den Beispieldaten nur A die Bedingung erfüllt, um beiden Spiele zu haben die gewünschte Zeit, B hat beide Spiele, aber nach der gewünschten Zeit, und C hat 2 der gleichen Spiele.

Verwandte Themen