Второй пример - явный курсор, и он статический. То есть это переменная, связанная с одним оператором SQL. Существует неявный эквивалент ...
FOR lrec in ( SELECT SomeTableID
FROM MYSCHEMA.SOMETABLE
WHERE SomeTableField = p_parameter )
LOOP
do_something_with (lrec.sometableid);
END LOOP;
Первый пример - это курсор ref, который является указателем на оператор SQL и поэтому может быть динамическим. Например, мы можем расширить этот пример следующим образом:
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;
Или даже:
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;
Таким образом, использование курсора ref дает нам намного больший контроль над последним оператором SQL, который выполняется. Другое отличие состоит в том, что, поскольку ref-курсор является указателем, он может передаваться между программами. Это очень полезно для передачи данных из PL / SQL на другие языки, например, набор результатов JDBC.