It is possible if you use a bit of PL/SQL magic. Here's an example how you can search for multiple titles (just add other parameters that you need).
Firstly, you need a table type as a parameter to hold multiple titles - that's the t_str_tab
type.
Secondly, you use the TABLE
function on that table parameter to be able to query it, and you access its values by using the pseudocolumn COLUMN_VALUE
.
Thirdly, you use a subquery to check if currently processed row has a title matching any of the titles provided in table parameter.
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;
Output:
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
Edit: changed the code to allow optional parameter.