Drugi przykład to wyraźny kursor i jest statyczny. Oznacza to, że jest to zmienna powiązana z jedną instrukcją SQL. Jest niejawna odpowiednik ...
FOR lrec in (SELECT SomeTableID
FROM MYSCHEMA.SOMETABLE
WHERE SomeTableField = p_parameter)
LOOP
do_something_with (lrec.sometableid);
END LOOP;
Pierwszym przykładem jest ref kursor, który jest wskaźnikiem do SQL i tak może być dynamiczny. Na przykład możemy przedłużyć ten przykład tak:
TYPE t_my_cursor IS REF CURSOR;
v_my_cursor t_my_cursor;
...
if flag = 1 then
OPEN v_my_cursor FOR SELECT SomeTableID
FROM MYSCHEMA.SOMETABLE
WHERE SomeTableField = p_parameter;
else
OPEN v_my_cursor FOR SELECT SomeTableID
FROM MYSCHEMA.ANOTHERTABLE
WHERE AnotherTableField = p_parameter;
end if;
lub nawet:
l_stmt := 'SELECT * FROM your_table WHERE ';
if p_parameter is not null then
l_stmt := l_stmt ||'id = :1';
open v_my_cursor for l_stmt using p_parameter;
else
l_stmt := l_stmt ||'created_date > trunc(sysdate)';
open v_my_cursor for l_stmt;
end if;
więc przy użyciu kursora ref daje nam dużo większą kontrolę nad końcowym SQL, który zostanie wykonany. Inna różnica polega na tym, że kursor ref jest wskaźnikiem, który można przekazywać między programami. Jest to bardzo przydatne przy przekazywaniu danych z PL/SQL do innych języków, na przykład zestawu wyników JDBC.