- Không cần khai báo
c1
nhập cho một con trỏ tham chiếu được nhập yếu. Bạn chỉ có thể sử dụngSYS_REFCURSOR
gõ. - Bạn không thể kết hợp các cuộc gọi con trỏ ngầm và rõ ràng như thế này. Nếu bạn định
OPEN
con trỏ, bạn phảiFETCH
từ nó trong một vòng lặp và bạn phảiCLOSE
nó. Bạn không thểOPEN
vàCLOSE
nó nhưng sau đó tìm nạp từ nó trong một vòng lặp con trỏ ngầm. - Bạn sẽ phải khai báo một biến (hoặc các biến) để tìm nạp dữ liệu vào. Tôi đã khai báo một loại bản ghi và một phiên bản của bản ghi đó nhưng bạn có thể dễ dàng khai báo hai biến cục bộ và
FETCH
vào các biến đó. -
ROWID
là một từ dành riêng nên tôi đã sử dụngROWPOS
thay vào đó.
Kết hợp chúng lại với nhau, bạn có thể viết một cái gì đó như
SQL> ed
Wrote file afiedt.buf
1 CREATE OR REPLACE Function Findposition (
2 model_in IN varchar2,
3 model_id IN number)
4 RETURN number
5 IS
6 cnumber number;
7 c2 sys_refcursor;
8 type result_rec is record (
9 id number,
10 rowpos number
11 );
12 l_result_rec result_rec;
13 BEGIN
14 open c2 FOR 'SELECT id,ROW_NUMBER() OVER ( ORDER BY id) AS rowpos FROM '||model_in;
15 loop
16 fetch c2 into l_result_rec;
17 exit when c2%notfound;
18 IF l_result_rec.id=model_id
19 then
20 cnumber :=l_result_rec.rowpos;
21 end if;
22 END LOOP;
23 close c2;
24 RETURN cnumber;
25* END;
SQL> /
Function created.
Tôi tin rằng điều này mang lại kết quả mà bạn mong đợi
SQL> create table foo( id number );
Table created.
SQL> insert into foo
2 select level * 2
3 from dual
4 connect by level <= 10;
10 rows created.
SQL> select findposition( 'FOO', 8 )
2 from dual;
FINDPOSITION('FOO',8)
---------------------
4
Lưu ý rằng từ quan điểm hiệu quả, bạn nên viết điều này dưới dạng một câu lệnh SQL duy nhất hơn là mở con trỏ và tìm nạp mọi hàng từ bảng mỗi lần. Nếu bạn quyết tâm sử dụng con trỏ, bạn muốn thoát khỏi con trỏ khi bạn tìm thấy hàng mình quan tâm hơn là tiếp tục tìm nạp mọi hàng từ bảng.
Từ quan điểm rõ ràng về mã, nhiều tên biến và kiểu dữ liệu của bạn có vẻ khá kỳ quặc. Tên thông số của bạn có vẻ được chọn kém-- Tôi không mong đợi model_in
ví dụ như tên của bảng nhập liệu. Khai báo con trỏ có tên c2
cũng có vấn đề vì nó rất không mô tả.