Need to dynamically select columns in a table which are not null

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • yoka
    New Member
    • Aug 2016
    • 1

    Need to dynamically select columns in a table which are not null

    I am trying to display columns in a table which are not null.

    For ex: My table has 10 columns. I insert values to
    this table using insert query. But i do not know for which columns i have inserted values.

    I want to select columns for which i have inserted values. I do not want to
    display all 10 columns. I used the following procedure from this blog but the problem is, it works only for queries which returns one row.

    I tried modifying this procedure to work for queries which returns more than
    one row. But, i could not do it.



    create or replace procedure no_nulls( p_sql in varchar2 ) is
    v_sql varchar2(32767) := p_sql;
    v_cursor integer := dbms_sql.open_c ursor;
    v_value varchar2(4000);
    v_status integer;
    v_desctab dbms_sql.desc_t ab;
    v_numcols integer;
    v_header1 varchar2(4000);
    v_header2 varchar2(4000);
    v_record varchar2(4000);
    v_length integer;
    begin

    dbms_sql.parse( v_cursor, v_sql, dbms_sql.native );
    dbms_sql.descri be_columns( v_cursor, v_numcols, v_desctab );

    for i in 1 .. v_numcols loop
    dbms_sql.define _column(v_curso r, i, v_value, 4000);
    end loop;

    v_status := dbms_sql.execut e(v_cursor);

    while ( dbms_sql.fetch_ rows(v_cursor) > 0 ) loop
    v_header1 := '';
    v_header2 := '';
    v_record := '';
    for i in 1 .. v_numcols loop
    dbms_sql.column _value( v_cursor, i, v_value );
    IF v_value IS NOT NULL THEN
    IF v_desctab(i).co l_type = 1 THEN -- Varchar2
    v_length := v_desctab(i).co l_max_len;
    ELSIF v_desctab(i).co l_type = 12 THEN -- Date
    v_length := 11;
    ELSE -- Assumes number!
    v_length := v_desctab(i).co l_precision+2;
    END IF;
    v_header1 := v_header1 || RPAD( v_desctab(i).co l_name, v_length ) || ' ';
    v_header2 := v_header2 || RPAD( '-', v_length, '-' ) || ' ';
    v_record := v_record || RPAD( v_value, v_length ) || ' ';
    END IF;
    end loop;
    dbms_output.put _line( v_header1 );
    dbms_output.put _line( v_header2 );
    dbms_output.put _line( v_record );
    end loop;
    end;
    /
Working...