Ví dụ thứ hai là con trỏ rõ ràng và nó là tĩnh. Nghĩa là, nó là một biến được kết hợp với một câu lệnh SQL. Có một tương đương tiềm ẩn ...
FOR lrec in (SELECT SomeTableID
FROM MYSCHEMA.SOMETABLE
WHERE SomeTableField = p_parameter)
LOOP
do_something_with (lrec.sometableid);
END LOOP;
Ví dụ đầu tiên là con trỏ ref, là con trỏ đến câu lệnh SQL và do đó có thể động. Ví dụ chúng ta có thể mở rộng ví dụ như thế này:
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;
Hoặc thậm chí:
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;
Vì vậy, sử dụng một con trỏ ref cho chúng ta kiểm soát nhiều hơn trong câu lệnh SQL thức mà được thực thi. Sự khác biệt khác là, bởi vì một con trỏ ref là một con trỏ nó có thể được truyền giữa các chương trình. Điều này rất hữu ích khi truyền dữ liệu từ PL/SQL sang các ngôn ngữ khác, ví dụ như một tập kết quả JDBC.