Anda dapat menggunakan paket DBMS_SQL. Ini memberikan cara alternatif untuk menjalankan SQL dinamis. Ini mungkin sedikit lebih rumit untuk digunakan, tetapi bisa lebih fleksibel, terutama dengan jumlah parameter pengikatan yang bervariasi.
Inilah cara Anda dapat menggunakannya (peringatan:Saya belum menguji ini):
FUNCTION player_search (
pName IN VARCHAR2,
pHeight IN NUMBER,
pTeam IN VARCHAR2
) RETURN SYS_REFCURSOR
IS
cursor_name INTEGER;
ignore INTEGER;
id_var MyTable.ID%TYPE;
name_var MyTable.Name%TYPE;
height_var MyTable.Height%TYPE;
team_var MyTable.Team%TYPE;
BEGIN
-- Put together SQLQuery here...
-- Open the cursor and parse the query
cursor_name := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cursor_name, SQLQuery, DBMS_SQL.NATIVE);
-- Define the columns that the query returns.
-- (The last number for columns 2 and 4 is the size of the
-- VARCHAR2 columns. Feel free to change them.)
DBMS_SQL.DEFINE_COLUMN(cursor_name, 1, id_var);
DBMS_SQL.DEFINE_COLUMN(cursor_name, 2, name_var, 30);
DBMS_SQL.DEFINE_COLUMN(cursor_name, 3, height_var);
DBMS_SQL.DEFINE_COLUMN(cursor_name, 4, team_var, 30);
-- Add bind variables depending on whether they were added to
-- the query.
IF pName IS NOT NULL THEN
DBMS_SQL.BIND_VARIABLE(cursor_name, ':pName', pName);
END IF;
IF pHeight > 0 THEN
DBMS_SQL.BIND_VARIABLE(cursor_name, ':pHeight', pHeight);
END IF;
IF pTeam IS NOT NULL THEN
DBMS_SQL.BIND_VARIABLE(cursor_name, ':pTeam', pTeam);
END IF;
-- Run the query.
-- (The return value of DBMS_SQL.EXECUTE for SELECT queries is undefined,
-- so we must ignore it.)
ignore := DBMS_SQL.EXECUTE(cursor_name);
-- Convert the DBMS_SQL cursor into a PL/SQL REF CURSOR.
RETURN DBMS_SQL.TO_REFCURSOR(cursor_name);
EXCEPTION
WHEN OTHERS THEN
-- Ensure that the cursor is closed.
IF DBMS_SQL.IS_OPEN(cursor_name) THEN
DBMS_SQL.CLOSE_CURSOR(cursor_name);
END IF;
RAISE;
END;
(Catatan:DBMS_SQL.TO_REFCURSOR
baru di Oracle 11g.)