Search code examples
oraclevariablesreflectionplsqldump

How to view the type of a variable in PL/SQL?


Is there a function in PL/SQL to show a variable's exact type, like the DUMP function in SQL?

I've tried the following

DECLARE
   l_variable   INTEGER := 1;
BEGIN
   DBMS_OUTPUT.PUT_LINE (DUMP (l_variable));
END;

But it gives the following error:

PLS-00204: function or pseudo-column 'DUMP' may be used inside a SQL statement only


Solution

  • You can create this function using PL/Scope. But it won't work with anonymous blocks, and you'll need to reference the variable as a string.

    create or replace function get_plsql_type_name
    (
        p_object_name varchar2,
        p_name varchar2
    ) return varchar2 is
        v_type_name varchar2(4000);
    begin
        select reference.name into v_type_name
        from user_identifiers declaration
        join user_identifiers reference
            on declaration.usage_id = reference.usage_context_id
            and declaration.object_name = reference.object_name
        where
            declaration.object_name = p_object_name
            and declaration.usage = 'DECLARATION'
            and reference.usage = 'REFERENCE'
            and declaration.name = p_name;
    
        return v_type_name;
    end;
    /
    

    Example:

    alter session set plscope_settings = 'IDENTIFIERS:ALL';
    
    create or replace type my_weird_type is object
    (
        a number
    );
    
    create or replace procedure test_procedure is
        var1 number;
        var2 integer;
        var3 my_weird_type;
        subtype my_subtype is pls_integer range 42 .. 43;
        var4 my_subtype;
    begin
        dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'VAR1'));
        dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'VAR2'));
        dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'VAR3'));
        dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'VAR4'));
    end;
    /
    
    begin
        test_procedure;
    end;
    /
    
    NUMBER
    INTEGER
    MY_WEIRD_TYPE
    MY_SUBTYPE