2014-12-21 107 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/)...) –