Dalam Oracle, kursor ialah mekanisme yang menggunakan kata kunci CURSOR untuk mentakrifkan set data yang ditanya oleh Oracle Set data yang ditanya boleh disimpan dalam memori, dan kemudian kursor menghala ke salah satu data Rekod, melalui kursor gelung untuk mencapai tujuan menggelung set data.
Persekitaran pengendalian tutorial ini: sistem Windows 7, versi Oracle 11g, komputer Dell G3.
Dalam Oracle, kursor ialah mekanisme yang mana nama boleh diberikan kepada pernyataan SELECT dan maklumat dalam pernyataan SQL tersebut boleh diproses.
Kursor Oracle mentakrifkan set set data yang ditanya oleh Oracle melalui kata kunci CURSOR Sama seperti tatasusunan, set data yang ditanya disimpan dalam memori, dan kemudian kursor menghala ke salah satu rekod, dan kursor digelung Mencapai tujuan menggelung set data.
Apakah fungsi kursor?
①Nyatakan kedudukan baris tertentu dalam set hasil.
②Dapatkan satu baris atau beberapa baris berturut-turut berdasarkan kedudukan set hasil semasa.
③ Ubah suai data dalam baris pada kedudukan semasa set hasil.
④ Tentukan tahap sensitiviti yang berbeza untuk perubahan data yang dibuat oleh pengguna lain.
⑤Pangkalan data boleh diakses secara pengaturcaraan.
Jenis kursor Oracle?
1. Kursor statik: kursor yang set keputusannya telah disahkan (ditakrifkan secara statik). Terbahagi kepada kursor tersirat dan eksplisit
Kursor tersirat: Semua pernyataan DML ialah kursor tersirat dan maklumat pernyataan SQL boleh diperoleh melalui atribut kursor tersirat.
Tunjukkan kursor: Pengguna memaparkan kursor yang diisytiharkan, iaitu set hasil yang ditentukan. Apabila pertanyaan mengembalikan lebih daripada satu baris hasil, kursor eksplisit diperlukan.
2. Kursor REF: objek sementara yang mengaitkan set hasil secara dinamik.
Apakah status kursor Oracle dan cara menggunakan atribut kursor?
①Status kursor diwakili oleh atribut.
%Dijumpai: Betul atau Salah bagi status pelaksanaan pernyataan Ambil (mendapatkan rekod).
%NotFound: Sama ada rekod terakhir diekstrak sebagai Betul atau Palsu.
%ISOpen: Betul atau Palsu sama ada kursor dibuka.
%RowCount: Bilangan baris yang sedang diekstrak oleh kursor.
②Gunakan sifat kursor.
Contoh:
/* conn scott/tiger */ Begin Update emp Set SAL = SAL + 0.1 Where JOB = 'CLERK'; If SQL%Found Then DBMS_OUTPUT.PUT_LINE('已经更新!'); Else DBMS_OUTPUT.PUT_LINE('更新失败!'); End If; End;
Bagaimana untuk menggunakan kursor paparan? Bagaimana untuk mengulangi kursor gelung?
1 Gunakan kursor paparan
untuk mengisytiharkan kursor: bahagikan kawasan storan Ambil perhatian bahawa pernyataan Pilih tidak dilaksanakan pada masa ini masa.
CURSOR 游标名( 参数 列表) [返回值类型] IS Select 语句;
Buka kursor: jalankan penyataan Pilih, dapatkan set hasil dan simpannya dalam kursor Pada masa ini, kursor menghala ke ketua set keputusan, bukan rekod pertama.
Open 游标名( 参数 列表);
Dapatkan rekod: Gerakkan kursor untuk mendapatkan rekod
Fetch 游标名InTo 临时记录或属性类型变量;
Tutup kursor: Letakkan kursor ke dalam kumpulan penimbal tanpa melepaskan sumber sepenuhnya. Boleh dibuka semula.
Close 游标名;
2. Kursor gelung traverse
Untuk kursor gelung
Kursor gelung tersembunyi Buka kursor, tatal secara automatik untuk mendapatkan rekod, dan buat pembolehubah jenis rekod sementara secara automatik untuk menyimpan rekod. Kursor ditutup secara automatik selepas diproses.
For 变量名 In 游标名 Loop 数据处理语句; End Loop;
Gelung Kursor
。。。 Loop Fatch 游标名InTo 临时记录或属性类型变量; Exit When 游标名%NotFound; End Loop; 。。。
Contoh 1:
/* conn scott/tiger */ Declare Cursor myCur is select empno,ename,sal from emp; vna varchar2(10); vno number(4); vsal number(7,2); Begin open myCur; fetch myCur into vno,vna,vsal; dbms_output.put_line(vno||' '||vna||' '||vsal); close myCur; End; /
Contoh 2: Menggunakan Gelung Traverse kursor.
/* conn scott/tiger */ Declare Cursor myCur is select ename,job,sal,empno from emp; varE myCur%rowType; Begin if myCur%isopen = false then open myCur; dbms_output.put_line('Opening...'); end if; loop fetch myCur into varE; exit when myCur%notfound; dbms_output.put_line(myCur%rowCount||' '||vare.empno||' '||vare.ename||' '||vare.sal); end loop; if myCur%isopen then Close myCur; dbms_output.put_line('Closing...'); end if; End; /
Contoh 3: Menggunakan gelung For untuk melintasi kursor,
/* conn scott/tiger */ Declare Cursor myCur is select * from emp; Begin for varA in myCur loop dbms_output.put_line(myCur%rowCount||' '||varA.empno||' '||varA.ename||' '||varA.sal); end loop; End; /
Bagaimana untuk mengemas kini dan memadam rekod dalam kursor yang dipaparkan?
①WHERE CURRENT OF substring dalam pernyataan KEMASKINI atau PADAM secara khusus mengendalikan data terbaharu yang diambil daripada jadual untuk dilakukan operasi KEMASKINI atau PADAM.
Untuk menggunakan kaedah ini, anda mesti menggunakan subrentetan FOR UPDATE apabila mengisytiharkan kursor Apabila dialog menggunakan substring FOR UPDATE untuk membuka kursor,
Semua baris data dalam set pulangan akan. berada dalam penguncian eksklusif Peringkat baris (ROW-LEVEL), objek lain hanya boleh menanyakan baris data ini,
tidak boleh melakukan operasi KEMASKINI, PADAM atau PILIH...UNTUK KEMASKINI.
Dalam pertanyaan berbilang jadual, gunakan klausa OF untuk mengunci jadual tertentu Jika klausa OF diabaikan, baris data yang dipilih dalam semua jadual akan dikunci.
Jika baris data ini telah dikunci oleh sesi lain, maka dalam keadaan biasa ORACLE akan menunggu sehingga baris data dibuka kuncinya.
②Gunakan kemas kini atau padam:
⑴Nyatakan kemas kini atau padam kursor paparan:
Cursor 游标名IS SELECT 语句 For Update [ Of 更新列列名]; Cursor 游标名IS SELECT 语句 For Delete [ Of 更新列列名];
⑵Gunakan rekod semasa kursor paparan untuk mengemas kini atau memadam:
Update 表名 SET 更新语句 Where Current Of 游标名; Delete From 表名 Where Current Of 游标名;
Contoh 1: Kemas kini rekod kursor paparan
/*conn scott/tiger*/ Declare Cursor myCur is select job from emp for update; vjob empa.job%type; rsal empa.sal%type; Begin open myCur; loop fetch myCur into vjob; exit when myCur%notFound; case (vjob) when 'ANALYST' then rsal := 0.1; when 'CLERK' then rsal := 0.2; when 'MANAGER' then rsal := 0.3; else rsal := 0.5; end case; update emp set sal = sal + rsal where current of myCur; end loop; End; /
Contoh 2: Padam rekod kursor paparan
/*conn scott/tiger Crate table empa Select * from scott.emp; */ Declare Cursor MyCursor Select JOB From empa For Update; vSal emp.Sal%TYPE; Begin Loop Fetch MyCursor InTo vSal; Exit When MyCursor%NotFound; If vSal < 800 Then Delete From empa Where Cursor Of MyCursor; End If; End Loop; End;/
Apakah kursor paparan dengan parameter?
1. Sama seperti prosedur dan fungsi, parameter boleh dihantar ke kursor dan digunakan dalam pertanyaan.
Parameter hanya menentukan jenis data, tiada saiz (semua parameter formal dalam Oracle hanya menentukan jenis data, tiada saiz dinyatakan).
与过程不同的是,游标只能接受传递的值,而不能返回值。
可以给参数设定一个缺省值,当没有参数值传递给游标时,就使用缺省值。
游标中定义的参数只是一个占位符,在别处引用该参数不一定可靠。
2、使用带参数的显示游标
声明带参数的显示游标:
CURSOR 游标名 [(parameter[,parameter],...)] IS Select语句;
参数形式:
1,参数名 数据类型
2,参数名 数据类型 DEFAULT 默认值
例子:
/*conn scott/tiger Crate table empa Select * from scott.emp; */ Declare Cursor MyCursor(pSal Number Default 800) Select JOB From empa Where SAL > pSal ; varA MyCursor%ROWTYPE; Begin Loop Fetch MyCursor InTo varA; Exit When MyCursor%NotFound; DBMS_OUTPUT.PUT_LINE(MyCursor%RowCount||' '||varA.empno||' '||varA.ename||' '||varA.sal); End Loop; End;/
推荐教程:《Oracle教程》
Atas ialah kandungan terperinci apa itu kursor oracle. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!