如何检查数组的内容是否在表中?

时间:2016-12-22 22:00:29

标签: arrays oracle stored-procedures plsql

好吧,让我们说我们有桌面游戏,如下:

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'和' Pac-man',' 2000'。

  

我试图创建一个程序,返回在给定日期拥有所有游戏的所有所有者。

我已经有了一个名为" checkGame"的函数,它给出了一个所有者和类型变量" array_ch1"返回1或0(如果该所有者拥有游戏并且在正确的购买日期,则返回1,否则返回0)。

我最初的想法是同时遍历桌面游戏和数组,并继续检查某个用户是否确实拥有了正确日期的正确游戏,但我不知道如何返回结果,也不知道如何返回结果如果有多个所有者符合标准,该怎么办。

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;
/

1 个答案:

答案 0 :(得分:2)

我只使用SQL查询,因为您的表类型array_ch2可用于查询:

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有两个相同的游戏。