Cari nilai khusus dalam semua jadual dalam pangkalan data Oracle
Soalan:
Dalam pangkalan data Oracle, terutamanya apabila berurusan dengan pangkalan data yang besar, pengguna mungkin perlu mencari nilai khusus untuk setiap medan dalam setiap jadual. Tugasan ini boleh mencabar kerana potensi panjang dan kerumitan pertanyaan sedemikian.
Penyelesaian:
Salah satu cara untuk menyelesaikan masalah ini ialah menggunakan teknologi berasaskan kursor untuk menjana pertanyaan SQL secara dinamik. Berikut ialah contoh ringkas:
<code class="language-sql">DECLARE CURSOR c_tab IS SELECT table_name, column_name FROM all_tab_columns WHERE owner = 'USER_NAME'; BEGIN FOR t IN c_tab LOOP EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || t.table_name || ' WHERE ' || t.column_name || ' = :1' INTO match_count USING '1/22/2008P09RR8'; IF match_count > 0 THEN dbms_output.put_line( t.table_name || ' ' || t.column_name || ' ' || match_count ); END IF; END LOOP; END; /</code>
Pertanyaan ini berulang melalui semua jadual dan lajur yang dimiliki oleh pengguna tertentu, menyemak sama ada setiap nilai sepadan dengan nilai yang diberikan. Hasilnya dipaparkan sebagai nama jadual, nama lajur dan kiraan baris yang sepadan.
Tingkatkan kecekapan:
Untuk mengoptimumkan prestasi, penapis lanjut boleh digunakan berdasarkan jenis data. Sebagai contoh, anda boleh mengubah suai pertanyaan untuk memfokuskan hanya pada lajur jenis '%CHAR%' kerana nilai yang ditentukan kelihatan seperti rentetan aksara.
Alternatif:
Sebagai alternatif, PL/SQL boleh digunakan untuk membenamkan pertanyaan SQL dinamik dalam sesi, yang mungkin menghasilkan pelaksanaan yang lebih pantas. Berikut ialah contoh kod:
<code class="language-sql">SET SERVEROUTPUT ON SIZE 100000 DECLARE match_count INTEGER; BEGIN FOR t IN (SELECT owner, table_name, column_name FROM all_tab_columns WHERE owner <> 'SYS' AND data_type LIKE '%CHAR%') LOOP EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name || ' WHERE ' || t.column_name || ' = :1' INTO match_count USING '1/22/2008P09RR8'; IF match_count > 0 THEN dbms_output.put_line( t.table_name || ' ' || t.column_name || ' ' || match_count ); END IF; END LOOP; END; /</code>
Atas ialah kandungan terperinci Bagaimana untuk Mencari Secara Cekap Merentas Semua Jadual dalam Oracle untuk Nilai Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!