Search code examples
oracle-databasefunctionplsqldynamicquerybind-variables

Execute Immediate bind variable


I have the following function that calculates content of the table but when I pass any param it throws:

EXEC DBMS_OUTPUT.PUT_LINE(get_size('employees'))
Error report -
ORA-00903: invalid table name
ORA-06512: at "HR.GET_SIZE", line 5
ORA-06512: at line 1
00903. 00000 -  "invalid table name"

Function

CREATE OR REPLACE FUNCTION get_size(v_table_name IN VARCHAR2) 
   RETURN NUMBER IS total_size NUMBER(16);
   plsql_statement VARCHAR2(500) := 'SELECT COUNT(*) FROM  :param';
BEGIN
    EXECUTE IMMEDIATE plsql_statement INTO total_size USING v_table_name;
    RETURN(total_size); 
END;
/


EXEC DBMS_OUTPUT.PUT_LINE(get_size('employees'));

Solution

  • You can't bind table names, it needs to be constructed.

    CREATE OR REPLACE FUNCTION get_size(v_table_name IN VARCHAR2) 
       RETURN NUMBER IS total_size NUMBER(16);
       plsql_statement VARCHAR2(500)
    BEGIN
        plsql_statement := 'SELECT COUNT(*) FROM  ' || v_table_name;
        EXECUTE IMMEDIATE plsql_statement INTO total_size;
        RETURN(total_size); 
    END;
    /
    
    
    EXEC DBMS_OUTPUT.PUT_LINE(get_size('employees'));