因此,我必须创建一个存储过程来在Oracle DataBase中搜索电影。在PL/SQL测试LOOP中替换DBMS_OUPUT以返回集合
搜索字符串遵循以下逻辑:
它看起来对电影的括号
防爆年。 (1992)它在括号内寻找一年的范围
Ex。 [1992,2000]它寻找包含在标题,国家,realisator,流派,演员或演员的单词。
以上任何一项都可以组合多次。例子:
Ex。 :主环伊恩麦克莱恩克里斯托弗·李[1992,2000]
逻辑用来解决这个问题是使一个巨大的查询组中的所有需要的数据,然后通过所述结果使用游标循环用光标设置以检查搜索字符串的每个单词是否有效。
我设法让一个程序按预期工作,但我发现返回结果的唯一方法是使用DBMS_OUTPUT。现在的问题是,当我插入这个Hibernate时,DBMS_OUTPUT不会被发送到客户端。我读过一些设置DBMS_OUTPUT.enable来强制输出的方式,但我觉得这不是正确的方法。
因此,这里是我的问题:
是我的逻辑缺陷?有一种更简单的方法来存档这与一个选择或什么?
有没有办法在游标内动态推送数据并将其返回?
我我真的应该因此被发送到休眠欺骗DBMS_OUTPUT?
这里是我的代码:
CREATE OR REPLACE PROCEDURE p_SearchFilm(searchString IN VARCHAR2) IS
IsValid BOOLEAN;
y1 INTEGER;
y2 INTEGER;
subStrArray apex_application_global.vc_arr2;
term VARCHAR(100);
CURSOR films IS
Select FilmId, Titre, real.Prenom||' '||real.nom as Realisateur, anneeSortie, ListPays, ListGenres,
ListScenaristes, ListActeurs, langueOrigine
from Film
natural left join
(select FilmId, listagg(p.Nom, ',') within group (Order By p.nom) ListPays from Film
natural join Film_vs_pays
natural join Pays p
Group by FilmId)
natural left join
(select FilmId, listagg(g.Nom, ',') within group (Order By g.nom) ListGenres from Film
natural join Film_vs_Genre
natural join Genre g
Group by FilmId)
natural left join
(select FilmId, listagg(p.Prenom||' '||p.Nom, ',') within group (Order By p.nom) ListScenaristes from Film
natural join Scenariste s
join Personne p on s.personneId = p.personneId
Group by FilmId)
natural left join
(select FilmId, listagg(p.Prenom||' '||p.Nom, ',') within group (Order By p.nom) ListActeurs from Film
natural join Personnage perso
join Personne p on perso.personneId = p.personneId
Group by FilmId)
left join Personne real on real.personneId = realisateurId;
BEGIN
<<FILM_LOOP>>
FOR film IN films LOOP
subStrArray := apex_util.string_to_table(searchString, ' ');
FOR i in 1..subStrArray.count LOOP
IsValid:= FALSE;
term:= subStrArray(i);
IF REGEXP_LIKE(term, '\(\d{4}\)') THEN
IF film.anneeSortie = TO_NUMBER(regexp_substr(term, '\d{4}')) THEN
IsValid:= TRUE;
END IF;
ELSIF REGEXP_LIKE(term, '\[\d{4},\d{4}\]') THEN
y1:= regexp_substr(term, '\d{4}', 1, 1);
y2:= regexp_substr(term, '\d{4}', 1, 2);
IF film.anneeSortie BETWEEN y1 AND y2 THEN
IsValid:= TRUE;
END IF;
ELSE
IF UPPER(film.Titre||film.Realisateur||film.ListActeurs||film.ListScenaristes||film.ListGenres||film.ListPays||film.langueOrigine)
LIKE '%'||UPPER(term)||'%' THEN
IsValid:= TRUE;
END IF;
END IF;
IF NOT IsValid THEN
CONTINUE FILM_LOOP;
END IF;
END LOOP;
DBMS_OUTPUT.put_line(film.FilmId||'|'||film.Titre);
END LOOP;
END;
小免责这里:
我看到了解决这个问题的一些类似的问题,但使用游标的人都返回完整选择,而不是手工挑选的行。
约DBMS_OUTPUT和Hibernate的问题指出,应该避免。
使用管道行缝合的问题只能与函数一起工作(更改过程调用的函数的过程可能是一种有效的解决方法,我想知道在tho之前是否还有其他可行的方法)。
这些条件应该是OR还是AND?因为您应该能够编写一个查询,以便为您提供符合这些条件的所有内容。 – SandPiper
他们是AND条件,我很乐意在单个查询中做到这一点,你能告诉我一个例子吗?例如:“电影标题”和“演员1”和“演员2”和“年份”(订单可以更改) – user3220633