3

私は2つの別々のクエリを書きました

1)


SELECT COLUMN_NAME
  FROM ALL_TAB_COLUMNS
 WHERE TABLE_NAME =
       (SELECT DISTINCT UT.TABLE_NAME
          FROM USER_TABLES UT
         WHERE UT.TABLE_NAME = 'MY_TABLE')
   AND COLUMN_NAME NOT IN ('AVOID_COLUMN')

2)


    SELECT *
      FROM MY_TABLE MT
     WHERE MT.COL1 = '1'
   

最初のクエリは、避けたい列を除くすべての列の名前を返します。2つ目は、テーブルのすべての列のデータを返します。これらのクエリをマージして、最初のクエリから返される2番目のクエリからそれらの列のデータのみが選択されるようにする方法はありますか?

前もって感謝します

4

1 に答える 1

4

これには動的SQLを使用する必要があります(ところで、USER_TABLESクエリの副選択を削除しました-不要です):

var  cur refcursor
/
declare
  v_stmt varchar2(4000);
begin
  v_stmt := 'SELECT ';  
  for cur in (
    SELECT COLUMN_NAME
    FROM ALL_TAB_COLUMNS
    WHERE TABLE_NAME =
       'MY_TABLE'
    AND COLUMN_NAME NOT IN ('AVOID_COLUMN')
  ) 
  loop
    v_stmt := v_stmt || cur.column_name || ',';
  end loop;
  -- get rid of trailing ','
  v_stmt := regexp_replace(v_stmt, ',$', '');

  v_stmt := v_stmt || ' from my_table MT WHERE MT.COL1 = ''1''';
  dbms_output.put_line(v_stmt);
  open :cur for v_stmt;
end; 
于 2012-06-28T10:56:27.420 に答える