1

Oracleで手順を書いています。検索に使用する必要があります。フォーム検索には 8 つのパラメーターがあり、各パラメーターには多くの値を含めることができます。たとえば、2 つの映画のタイトルを追加できます (タイトル全体を入力しないように選択できます)。タイトルではなく、年を入力することもできます..

パラメータに複数の値を設定できるかどうかわかりません。

SQLクエリのみで構築したいのですが、可能ですか? where句には8つのパラメータが含まれているため..この検索で​​迷子になりました!

私はこの手順を持っています(うまくいきません)

create or replace procedure listerFilms (
unTitreFilm Film.titre%TYPE DEFAULT NULL,
uneAnneeMin  Film.annee%TYPE DEFAULT NULL,
uneAnneeMax  Film.annee%TYPE DEFAULT NULL,
uneVoFilm    Film.langue%TYPE DEFAULT NULL,
unPaysProd  Pays.pays%TYPE DEFAULT NULL,
unGenreFilm Genre.genre%TYPE DEFAULT NULL,
unNomRea    Equipe_Tournage.nomComplet%TYPE DEFAULT NULL,
unNomActeur Equipe_Tournage.nomComplet%TYPE DEFAULT NULL)
is
titreFilm Film.titre%TYPE;
anneeFilm Film.annee%TYPE;

cursor lignesFilm(leTitreFilm Film.titre%TYPE, laAnneeMin  Film.annee%TYPE, laAnneeMax  Film.annee%TYPE, laVoFilm Film.langue%TYPE, lePaysProd  Pays.pays%TYPE, leGenreFilm Genre.genre%TYPE, leNomRea Equipe_Tournage.nomComplet%TYPE, leNomActeur Equipe_Tournage.nomComplet%TYPE) is
    select distinct
        f.titre, f.annee
    from 
        Film f, Pays p, Genre g, Equipe_Tournage rea, Equipe_Tournage act
    where 
        f.titre like '%'||leTitreFilm||'%' and f.annee >= laAnneeMin and f.annee <= laAnneeMax
        and f.langue like '%'||laVoFilm||'%' and p.pays like '%'||lePaysProd||'%' 
        and g.genre like '%'||leGenreFilm||'%' and rea.nomComplet like '%'||leNomRea||'%'
        and act.nomComplet like '%'||leNomActeur||'%';

begin
open lignesFilm(unTitreFilm,uneAnneeMin, uneAnneeMax, uneVoFilm, unPaysProd, unGenreFilm, unNomRea, unNomActeur);
DBMS_OUTPUT.PUT_LINE('---------------------');
DBMS_OUTPUT.PUT_LINE('-- Liste des Films --');
DBMS_OUTPUT.PUT_LINE('---------------------');

EXCEPTION
WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Aucun film ne correpond au(x) critere(s) de recherche');
WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20001,'Exception levée par la procédure');

loop
    fetch lignesFilm into titreFilm, anneeFilm;
    -- fetch retoune la ligne suivante

    EXIT WHEN lignesFilm%NOTFOUND;
    -- quit lorsque cursor fini

    DBMS_OUTPUT.PUT_LINE(titreFilm || ' (' || anneeFilm || ')');
end loop;
close lignesFilm;


end;
/

私を助けてください

4

1 に答える 1

0

PL/SQL マジックを少し使えば可能です。複数のタイトルを検索する方法の例を次に示します (必要な他のパラメーターを追加するだけです)。

まず、複数のタイトルを保持するためのパラメータとしてテーブル タイプが必要です。それがt_str_tabタイプです。

次に、TABLEそのテーブル パラメーターに対して関数を使用してクエリを実行できるようにし、 pseudocolumn を使用してその値にアクセスしますCOLUMN_VALUE

3 番目に、サブクエリを使用して、現在処理されている行に、テーブル パラメーターで指定されたタイトルのいずれかと一致するタイトルがあるかどうかを確認します。

CREATE TABLE movies (id NUMBER, title VARCHAR2(20), release_year NUMBER);

CREATE TYPE t_str_tab IS TABLE OF VARCHAR2(20);
CREATE TYPE t_num_tab IS TABLE OF NUMBER;

INSERT INTO movies VALUES (1, 'First movie', 2010);
INSERT INTO movies VALUES (2, 'Second movie', 2010);
INSERT INTO movies VALUES (3, 'Third movie', 2010);

COMMIT;

CREATE OR REPLACE PROCEDURE search_proc(p_titles IN t_str_tab, p_years IN t_num_tab DEFAULT NULL) AS
  CURSOR c_movies IS
    SELECT m.id, m.title, m.release_year
      FROM movies m
    WHERE
      ((SELECT COUNT(1) FROM TABLE(p_titles)) = 0
        OR EXISTS (
          SELECT 1
            FROM TABLE(p_titles) -- magic
          WHERE upper(m.title) LIKE '%' || UPPER(column_value) || '%')
      )
      AND
      ((SELECT COUNT(1) FROM TABLE(p_years)) = 0
        OR EXISTS (
          SELECT 1
            FROM TABLE(p_years)
          WHERE m.release_year = column_value)
      )
  ;
BEGIN
  FOR v_movie IN c_movies
  LOOP
    dbms_output.put_line(
      'Id: ' || v_movie.id ||
      ', title: ' || v_movie.title ||
      ', release year: ' || v_movie.release_year);
  END LOOP;
END;
/

BEGIN
  dbms_output.put_line('First search:');
  search_proc(t_str_tab('d'));

  dbms_output.put_line('Second search:');
  search_proc(t_str_tab('st', 'nd'));
END;

出力:

最初の検索:
ID: 2、タイトル: 映画第 2 弾、公開年: 2010
ID: 3、タイトル: 3 番目の映画、リリース年: 2010
2 回目の検索:
ID: 1、タイトル: 最初の映画、リリース年: 2010
ID: 2、タイトル: 映画第 2 弾、公開年: 2010

編集:オプションのパラメータを許可するようにコードを変更しました。

于 2013-10-16T19:56:50.223 に答える