Parameterisasi nilai untuk Oracle sql

Saya menggunakan Oracle - pengembang SQL

Ingin memeriksa jumlah nilai nol untuk setiap kolom.

Saat ini saya menggunakan di bawah ini untuk mencapai hasil.

pilih COLUMN_NAME dari all_tab_columns di mana table_name = 'EMPLOYEE'

    SELECT COUNT (*) FROM EMPLOYEE WHERE <Column_name1> IS NULL
    UNION ALL
    SELECT COUNT (*) FROM EMPLOYEE WHERE <Column_name2> NULL
    UNION ALL
    SELECT COUNT (*) FROM EMPLOYEE WHERE <Column_name3> IS NULL
    UNION ALL ......................

Bagaimana kita bisa menggunakan nilai pengikatan untuk menjalankan kueri di bawah ini

   DEFINE Column_name = Column_name1
   SELECT COUNT (*) FROM EMPLOYEE WHERE &&Column_name IS NULL .

person Awknewbie    schedule 27.08.2014    source sumber
comment
Anda harus menggunakan cara sql dinamis untuk itu.   -  person Sathyajith Bhat    schedule 27.08.2014
comment
NUM_NULLS di all_tab_columns akan memiliki jumlah nilai NULL di tabel ini. Asalkan tabel tersebut memiliki statistik yang diperbarui!! Data apa pun yang dimasukkan/diperbarui tanpa mengumpulkan statistik akan menghasilkan jawaban yang salah. Untuk mengetahui tentang statistik, Anda dapat merujuk Oracle Docs   -  person Maheswaran Ravisankar    schedule 27.08.2014


Jawaban (3)


Anda tidak dapat menggunakan variabel pengikat saat membuat pernyataan pilih, Anda dapat meneruskan nilai melalui variabel pengikat, namun pernyataan pilih itu sendiri tidak dapat dibuat. Anda harus menggunakan cara SQL dinamis, menggunakan EXECUTE IMMEDIATE.

Berikut ini contohnya:

DECLARE
    v_sql_statement VARCHAR2(2000);
    n_null_count    NUMBER;
BEGIN
    FOR cn IN (SELECT column_name
               FROM   user_tab_cols
               WHERE  table_name = 'EMPLOYEE') LOOP
        v_sql_statement := 'SELECT COUNT(1) FROM EMPLOYEE where '
                           || cn.column_name
                           || ' IS null';

        EXECUTE IMMEDIATE v_sql_statement INTO n_null_count;

        dbms_output.Put_line('Count of nulls for column: '
                             || cn.column_name
                             || ' is: '
                             || n_null_count);
    END LOOP;
END; 

Inilah yang akan diambil oleh kueri di atas

Jumlah null untuk kolom: EMPNO adalah: 0
Jumlah null untuk kolom: NAMA adalah: 0
Jumlah null untuk kolom: JOB adalah: 0
Jumlah null untuk kolom: BOSS adalah: 1< br> Jumlah nol untuk kolom: HIREDATE adalah: 0
Jumlah nol untuk kolom: GAJI adalah: 0
Jumlah nol untuk kolom: COMM adalah: 20
Jumlah nol untuk kolom: DEPTNO adalah: 0

person Sathyajith Bhat    schedule 27.08.2014
comment
Mengapa tidak ada satu pun EXECUTE IMMEDIATE yang menggunakan all_tab_columns? COUNT(COLUMN_NAME1),COUNT(COLUMN_NAME2) FROM TABLE? - person Maheswaran Ravisankar; 27.08.2014
comment
@MaheswaranRavisankar COLUMN_NAME1, COLUMN_NAME2... COLUMN_NAMEn adalah baris di all_tab_columns, Anda perlu mengulang semua baris dan tidak menemukan nol untuk setiap nama_kolom - person Sathyajith Bhat; 27.08.2014
comment
Terima kasih Satya atas bimbingannya - person Awknewbie; 27.08.2014

Tidak, Anda tidak dapat melakukan ini dengan variabel pengikat. Hal ini karena query dipenuhi dan harus mengetahui nama field pada waktu kompilasi. Untuk mencapai apa yang Anda inginkan, Anda dapat membuat kueri yang Anda butuhkan di VARCHAR2 dan langsung menggunakan eksekusi.

person Robert3452    schedule 27.08.2014

Mengapa tidak menggunakan NUM_NULLS saja? Tapi Anda harus mengumpulkan statistik sebelumnya

exec dbms_stats.gather_table_stats('user','TBL');

select num_nulls from user_tab_columns where table_name='TBL';

Anda juga dapat menggunakan coalesce untuk eksekusi yang lebih cepat daripada IS NULL

SELECT COUNT(COALESCE( _COLUMN, 1)) AS CNT FROM _TABLE;

Jika Anda ingin menghitung kolom secara bijaksana maka saya akan memilih jawaban Sathya yang kedua tetapi dengan COALESCE bukannya IS NULL

person SriniV    schedule 27.08.2014