参数化oracle sql的值

时间:2014-08-27 10:06:01

标签: oracle plsql oracle-sqldeveloper

我正在使用Oracle - SQL开发人员

想要检查每列的空值计数。

目前我正在使用以下方法取得成果。

从all_tab_columns中选择COLUMN_NAME,其中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 ......................

我们如何使用绑定值来运行以下查询,如

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

3 个答案:

答案 0 :(得分:1)

在构造select语句时不能使用绑定变量,可以通过绑定变量传递值,但不能构造select语句本身。你必须去the dynamic SQL way, using EXECUTE IMMEDIATE

以下是一个例子:

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; 

以上查询将提取

  

列的空值计数:EMPNO是:0
  列的空值计数:NAME为:0
  列的空值计数:JOB为:0
  列的空值计数:BOSS是:1
  列的空值计数:HIREDATE为:0
  列的空值计数:SALARY为:0
  列的空值计数:COMM为:20
  列的空值计数:DEPTNO为:0

答案 1 :(得分:0)

不,你不能用绑定变量做到这一点。 这是因为查询已得到编译,并且必须在编译时知道字段名称。 要实现您的目标,您可以在VARCHAR2中构建所需的查询并使用execute immediate。

答案 2 :(得分:0)

为什么不简单地使用NUM_NULLS?但你应该在

之前收集统计数据
exec dbms_stats.gather_table_stats('user','TBL');

select num_nulls from user_tab_columns where table_name='TBL';

您还可以使用coalesce来加快执行速度,而不是IS NULL

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

如果你想有列明智的计数,那么我会用S COALESCE而不是IS NULL来回答Sathya的回答