2013-08-16 102 views
7

Vui lòng giải thích cho tôi cách sử dụng con trỏ cho vòng lặp trong oracle.Con trỏ vòng lặp trong Oracle

Nếu tôi sử dụng mã tiếp theo, tất cả đều ổn.

for rec in (select id, name from students) loop 
    -- do anything 
end loop; 

Nhưng nếu tôi xác định biến cho câu lệnh sql này, nó không hoạt động.

v_sql := 'select id, name from students'; 

for rec in v_sql loop 
    -- do anything 
end loop; 

Lỗi: PLS-00.103

Trả lời

10

Để giải quyết các vấn đề liên quan đến việc tiếp cận thứ hai trong câu hỏi của bạn, bạn cần phải sử dụng

biến con trỏ và cách rõ ràng mở một con trỏ và lấy dữ liệu. Nó không phải là

phép sử dụng biến con trỏ vào FOR loop:

declare 
    l_sql varchar2(123);  -- variable that contains a query 
    l_c sys_refcursor;  -- cursor variable(weak cursor). 
    l_res your_table%rowtype; -- variable containing fetching data 
begin 
    l_sql := 'select * from your_table'; 

    -- Open the cursor and fetching data explicitly 
    -- in the LOOP. 

    open l_c for l_sql; 

    loop 
    fetch l_c into l_res; 
    exit when l_c%notfound; -- Exit the loop if there is nothing to fetch. 

    -- process fetched data 
    end loop; 

    close l_c; -- close the cursor 
end; 

Find out more

+1

Câu trả lời thích hợp nhất này cho bây giờ. Tôi nghĩ, tất cả sẽ dễ dàng hơn. Cảm ơn quyết định của bạn. –

5

thử điều này:

cursor v_sql is 
select id, name from students; 

for rec in v_sql 
loop 
    -- do anything 
end loop; 

sau đó không cần phải open, fetch hoặc close con trỏ .

+0

Tôi nghĩ rằng, mã này sẽ làm việc nếu tôi sẽ biết mã sql trên sân khấu định nghĩa, nhưng nó tạo ra trên sân khấu thực hiện. –

+0

bạn có thể xác định các tham số trong định nghĩa con trỏ, nhưng chỉ cho mệnh đề where. Nếu bạn cần thiết lập bảng động, thì 'OPEN c FOR string' có lẽ là cách để đi. –

0

Bạn phải sử dụng Refcursor nếu bạn đang thực hiện truy vấn trong thời gian chạy. Trên thực tế refcursors là con trỏ đến truy vấn họ sẽ không chiếm bất kỳ không gian nào cho các hàng được tìm nạp. Các con trỏ bình thường sẽ không hoạt động.

declare 
v_sql varchar2(200); 
rec sys_refcursor; 
BEGIN 
v_sql := 'select id, name from students'; 

open rec for v_sql 
loop 
fetch 
exit when.... 
-- do anything 
end loop; 
2

Bạn không thực thi chuỗi sql đó ở bất kỳ đâu. Đơn giản chỉ cần làm điều này

v_sql := 'select id, name from students'; 
open cur for v_sql; 
for rec in cur loop 
    -- do anything 
end loop; 

Hoặc bạn có thể làm điều này

cursor cur is select id, name from students; 
open cur; 
for rec in cur loop 
     -- do anything 
end loop; 

Hoặc bạn có thể làm

for rec in (select id, name from students) loop 
    -- do anything 
end loop 
Các vấn đề liên quan