Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

fungsi oracle dan kursor menggunakan nama tabel dinamis

  • Tidak perlu mendeklarasikan c1 ketik untuk kursor ref yang diketik dengan lemah. Anda cukup menggunakan SYS_REFCURSOR ketik.
  • Anda tidak dapat mencampur panggilan kursor implisit dan eksplisit seperti ini. Jika Anda akan OPEN kursor, Anda harus FETCH dari itu dalam satu lingkaran dan Anda harus CLOSE dia. Anda tidak dapat OPEN dan CLOSE 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 menggunakan ROWPOS 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memindahkan file Zip ke kolom gumpalan di Jawa?

  2. Bagaimana cara membuat daftar semua tanggal antara sysdate-30 dan sysdate+30?

  3. Bagaimana melakukan transaksi individu di Oracle PLSQL

  4. Apa alternatif MySQL untuk fungsi NEXT_DAY Oracle?

  5. Pilih dari tabel jika catatan ditemukan di tabel lain