Você pode analisar a instrução com DBMS_SQL.parse e obtenha as colunas com DBMS_SQL.describe_columns :
DECLARE
v_SQL VARCHAR2(32767 CHAR);
v_Result VARCHAR2(32767 CHAR) := '';
l_cursor PLS_INTEGER;
l_col_cnt PLS_INTEGER;
i PLS_INTEGER;
l_desc_tab DBMS_SQL.desc_tab;
BEGIN
v_SQL := q'[SELECT 1 as "MY_NUMBER", 'z' as "MY_CHAR" from dual]';
l_cursor := DBMS_SQL.open_cursor;
DBMS_SQL.parse(l_cursor, v_SQL, DBMS_SQL.native);
DBMS_SQL.describe_columns(l_cursor, l_col_cnt, l_desc_tab);
FOR i IN 1 .. l_col_cnt LOOP
v_Result := v_Result ||' ' || l_desc_tab(i).col_name;
END LOOP;
DBMS_OUTPUT.put_line('v_Result: ' || v_Result);
END;
/