2013-10-16 1 views
1

나는 Oracle에서 절차를 작성하고 있습니다. 나는 그것을 수색에 사용해야한다. 양식 검색에는 8 개의 매개 변수가 있으며 각 매개 변수에는 많은 값이 포함될 수 있습니다. 예를 들어 두 개의 영화 제목을 추가 할 수 있습니다 (전체 제목을 입력하지 않도록 선택할 수 있음). 당신은 또한 제목이 아니라 년을 tyoe 할 수 있습니다 ..Oracle 절차 및 선택적 매개 변수의 다중 값

내 매개 변수에 대해 다중 값을 가질 수 있는지 모르겠습니까?

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; 
/

나를 도와주세요이 절차 (일하지 않음)이

+0

지금까지 해보신 것은 무엇입니까? 다음을 검토하십시오 : http://stackoverflow.com/help/on-topic –

+0

나는 편집 할 필요가 있지만 절차를 완료해야하지만 성공하지는 못합니다./ –

답변

0

당신은 PL/SQL 마법의 비트를 사용하는 경우가있다. 다음은 여러 제목을 검색하는 방법을 보여주는 예입니다 (필요한 다른 매개 변수 만 추가하면됩니다).

첫째, 여러 제목을 저장하는 매개 변수로 테이블 유형이 필요합니다. 즉, t_str_tab 유형입니다.

둘째, 해당 테이블 매개 변수에 TABLE 함수를 사용하여 쿼리 할 수 ​​있으며 가상 배열 COLUMN_VALUE을 사용하여 그 값에 액세스합니다.

세 번째로 현재 처리 된 행에 table 매개 변수에 제공된 제목 중 하나와 일치하는 제목이 있는지 확인하기 위해 하위 쿼리를 사용합니다.

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; 

출력 :

First search: 
Id: 2, title: Second movie, release year: 2010 
Id: 3, title: Third movie, release year: 2010 
Second search: 
Id: 1, title: First movie, release year: 2010 
Id: 2, title: Second movie, release year: 2010

편집은 : 선택적 매개 변수를 허용하도록 코드를 변경했습니다.

+0

그래, 정말 고마워. 어떻게 일하는거야! 하지만 난 여전히 문제가있다. 선택 사항 인 2 개의 매개 변수가있다. LIKE가 작동하지 않는다./ –

+0

@BaptisteLemarcis 빈 배열의 가능성을 고려한다면 작동 할 것이다. 내말은. –

+0

그리고 지금 코드를 이해할 수 없습니다. 왜 = 0을 넣을까요? –