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;
/
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;
/