この割り当ては、Oracle DataBaseでムービーを検索するためのストアド・プロシージャを作成する必要があります。PL/SQLテストLOOPでDBMS_OUPUTを置換してコレクションを戻す
検索文字列は、次のロジックに従います。
それはカッコ
例では、映画の年を探します。 (1992)括弧内に年の範囲を探します。
Ex。 [1992,2000]タイトル、国、実在主体、ジャンル、俳優または脚本家に含まれる単語を検索します。
上記のいずれかを複数回組み合わせることができます。
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についての質問は避けるべきだと述べました。
機能でのみ動作するようにパイプの列を使用して質問しています(プロシージャで呼び出された関数のプロシージャを変更すると有効な回避策になる可能性があります。
これらの条件は、ORまたはANDである必要がありますか?これらの基準を満たすすべてのものを提供するクエリを書くことができるはずです。 – SandPiper
これはAND条件であり、これを1回のクエリで実行したいと思っています。例: "映画タイトル" AND "Actor 1" AND "Actor 2" AND "Year range"(注文は変更可能) – user3220633