Rumah  >  Artikel  >  pangkalan data  >  apa itu kursor oracle

apa itu kursor oracle

青灯夜游
青灯夜游asal
2022-02-23 11:35:0413287semak imbas

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.

apa itu kursor oracle

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||&#39;    &#39;||varA.empno||&#39;    &#39;||varA.ename||&#39;  &#39;||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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn