好吧,让我们说我们有桌面游戏,如下:
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;
/
答案 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有两个相同的游戏。