因此,我必須創建一個存儲過程來在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