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

Sintaks untuk evaluasi malas kustom/hubungan arus pendek parameter fungsi

Evaluasi malas dapat (sebagian) diimplementasikan menggunakan kursor ref, kompilasi bersyarat, atau langsung dieksekusi. Jenis ANYDATA dapat digunakan untuk meneruskan data umum.

Ref Kursor

Kursor ref dapat dibuka dengan pernyataan SQL statis, diteruskan sebagai argumen, dan tidak akan dijalankan hingga diperlukan.

Meskipun ini benar-benar menjawab pertanyaan Anda tentang evaluasi malas, saya tidak yakin apakah itu benar-benar praktis. Ini bukan tujuan penggunaan kursor ref. Dan mungkin tidak nyaman untuk menambahkan SQL ke semuanya.

Pertama, untuk membuktikan bahwa fungsi lambat sedang berjalan, buat fungsi yang hanya tidur selama beberapa detik:

grant execute on sys.dbms_lock to <your_user>;

create or replace function sleep(seconds number) return number is
begin
    dbms_lock.sleep(seconds);
    return 1;
end;
/

Buat fungsi untuk menentukan apakah evaluasi diperlukan:

create or replace function do_i_have_to_trace return boolean is
begin
    return true;
end;
/

Fungsi ini dapat melakukan pekerjaan dengan mengeksekusi pernyataan SQL. Pernyataan SQL harus mengembalikan sesuatu, meskipun Anda mungkin tidak menginginkan nilai kembalian.

create or replace procedure trace_something(p_cursor sys_refcursor) is
    v_dummy varchar2(1);
begin
    if do_i_have_to_trace then
        fetch p_cursor into v_dummy;
    end if;
end;
/

Sekarang buat prosedur yang akan selalu memanggil trace tetapi tidak perlu menghabiskan waktu untuk mengevaluasi argumen.

create or replace procedure lazily_trace_something(some_number in number) is
    v_cursor sys_refcursor;
begin
    open v_cursor for select sleep(some_number) from dual;
    trace_something(v_cursor);
end;
/

Secara default ia bekerja dan lambat:

--Takes 2 seconds to run:
begin
    lazily_trace_something(2);
end;
/

Tetapi ketika Anda mengubah DO_I_HAVE_TO_TRACE untuk mengembalikan false prosedurnya cepat, meskipun melewati argumen yang lambat.

create or replace function do_i_have_to_trace return boolean is
begin
    return false;
end;
/

--Runs in 0 seconds.
begin
    lazily_trace_something(2);
end;
/

Opsi Lain

Kompilasi bersyarat lebih tradisional digunakan untuk mengaktifkan atau menonaktifkan instrumentasi. Misalnya:

create or replace package constants is
    c_is_trace_enabled constant boolean := false;
end;
/

declare
    v_dummy number;
begin
    $if constants.c_is_trace_enabled $then
        v_dummy := sleep(1);
        This line of code does not even need to be valid!
        (Until you change the constant anyway)
    $else
        null;
    $end
end;
/

Anda mungkin juga ingin mempertimbangkan kembali SQL dinamis. Gaya pemrograman dan beberapa gula sintaksis dapat membuat perbedaan besar di sini. Singkatnya, sintaks kutipan alternatif dan templat sederhana dapat membuat SQL dinamis jauh lebih mudah dibaca. Untuk detail lebih lanjut, lihat posting saya di sini .

Meneruskan Data Umum

Tipe APAPUN dapat digunakan untuk menyimpan dan meneruskan tipe data apa pun yang dapat dibayangkan. Sayangnya tidak ada tipe data asli untuk setiap tipe baris. Anda harus membuat TYPE untuk setiap tabel. Jenis kustom tersebut sangat sederhana sehingga langkah dapat diotomatisasi jika diperlukan.

create table some_table(a number, b number);
create or replace type some_table_type is object(a number, b number);

declare
    a_rowtype_variable some_table_type;
    v_anydata anydata;
    v_cursor sys_refcursor;
begin
    a_rowtype_variable := some_table_type(1,2);
    v_anydata := anydata.ConvertObject(a_rowtype_variable);
    open v_cursor for select v_anydata from dual;
    trace_something(v_cursor);
end;
/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Paksa penggunaan indeks di Oracle

  2. Bagaimana cara menghitung jumlah kemunculan karakter dalam nilai Oracle varchar?

  3. SSIS gagal menyimpan paket dan mem-boot ulang Visual Studio

  4. Memanggil fungsi dengan parameter tipe yang ditentukan pengguna (Oracle ODP.NET)

  5. Fungsi TO_CHAR(angka) di Oracle