2014-12-21 61 views
1

我想编写一个函数来返回名称作为变量传入的表的行计数。这里是我的代码:作为plsql参数传入表名

create or replace function get_table_count (table_name IN varchar2) 
    return number 
is 
    tbl_nm varchar(100) := table_name; 
    table_count number; 
begin 
    select count(*) 
    into table_count 
    from tbl_nm; 
    dbms_output.put_line(table_count); 
    return table_count; 
end; 

我得到这个错误:

FUNCTION GET_TABLE_COUNT compiled 
Errors: check compiler log 
Error(7,5): PL/SQL: SQL Statement ignored 
Error(9,8): PL/SQL: ORA-00942: table or view does not exist 

我明白tbl_nm被解释为一个值,而不是一个参考,我不知道如何逃脱。

回答

7

您可以使用动态SQL:

create or replace function get_table_count (table_name IN varchar2) 
    return number 
is 
    table_count number; 
begin 
    execute immediate 'select count(*) from ' || table_name into table_count; 
    dbms_output.put_line(table_count); 
    return table_count; 
end; 

还有一个间接的方式(用系统的观点),以获得行数:

create or replace function get_table_count (table_name IN varchar2) 
    return number 
is 
    table_count number; 
begin 
    select num_rows 
    into table_count 
    from user_tables 
    where table_name = table_name; 

    return table_count; 
end; 

第二种方法只适用,如果你已经聚集调用此函数之前的表上的统计信息。

+3

我想补充一下,第二个选项是你不需要验证table_name的主要优点(记得[Little Bobby Tables](http://xkcd.com/327/)...) –