- Tidak perlu mendeklarasikan
c1
ketik untuk kursor ref yang diketik dengan lemah. Anda cukup menggunakanSYS_REFCURSOR
ketik. - Anda tidak dapat mencampur panggilan kursor implisit dan eksplisit seperti ini. Jika Anda akan
OPEN
kursor, Anda harusFETCH
dari itu dalam satu lingkaran dan Anda harusCLOSE
dia. Anda tidak dapatOPEN
danCLOSE
tetapi kemudian mengambilnya dalam loop kursor implisit. - Anda harus mendeklarasikan variabel (atau variabel) untuk mengambil data. Saya mendeklarasikan jenis catatan dan turunan dari catatan itu tetapi Anda dapat dengan mudah mendeklarasikan dua variabel lokal dan
FETCH
ke dalam variabel tersebut. ROWID
adalah kata yang dicadangkan jadi saya menggunakanROWPOS
sebagai gantinya.
Dengan menggabungkannya, Anda dapat menulis sesuatu seperti
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.
Saya yakin ini mengembalikan hasil yang Anda harapkan
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
Perhatikan bahwa dari sudut pandang efisiensi, Anda akan jauh lebih baik menulis ini sebagai satu pernyataan SQL daripada membuka kursor dan mengambil setiap baris dari tabel setiap saat. Jika Anda bertekad untuk menggunakan kursor, Anda sebaiknya keluar dari kursor saat menemukan baris yang Anda minati daripada terus mengambil setiap baris dari tabel.
Dari sudut pandang kejelasan kode, banyak nama variabel dan tipe data Anda tampak agak aneh. Nama parameter Anda tampaknya tidak dipilih dengan baik-- Saya tidak mengharapkan model_in
menjadi nama tabel input, misalnya. Mendeklarasikan kursor bernama c2
juga bermasalah karena sangat non-deskriptif.