2010-02-23 37 views
5

Sự khác nhau giữa hai đoạn mã này là gì?Trong Oracle sự khác nhau giữa mở và mở con trỏ với các tham số là gì?

TYPE t_my_cursor IS REF CURSOR; 
v_my_cursor t_my_cursor; 
OPEN v_my_cursor FOR SELECT SomeTableID 
     FROM MYSCHEMA.SOMETABLE 
     WHERE SomeTableField = p_parameter; 

Và ...

CURSOR v_my_cur(p_parameter VARCHAR2) IS 
SELECT SomeTableID 
FROM MYSCHEMA.SOMETABLE 
WHERE SomeTableField = p_parameter; 

OPEN presf_cur(p_subscriber_id); 

Cả hai đều có vẻ làm việc. Họ có giống nhau hay có sự khác biệt nào tôi nên biết không?

Trả lời

6

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.

5
  1. Con trỏ được nhập mạnh có thể được 'mô tả'.
  2. Nếu xây dựng của bạn một API (một gói), bạn có thể đặt định nghĩa con trỏ của bạn tại đặc tả mức và cung cấp cho các lập trình viên khách hàng một cảm giác tốt hơn về gì API của bạn không và trả mà không cần phải được nhận thức của mã nguồn.
  3. Công cụ bố cục/IDE/GUI có thể sẽ đẹp hơn với con trỏ có tên là .
  4. Có thể có lợi ích hiệu suất không đáng kể khi có con trỏ đã nhập; nhưng tôi sẽ không tin vào nó là bất cứ điều gì đáng kể.
Các vấn đề liên quan