相関のない名前(ABC1、DA23、EE123 - そこに共通のパターンはありません)を持たない100列の表があります。行の列を反復する
この表のすべての行とすべての列を繰り返し処理します。
は私の現在のスクリプト:
はBEGIN
FOR single_row IN (
SELECT *
FROM MY_TABLE)
LOOP
--iterate through columns of 'single_row'
--for each nullable column do insert with real current column name and column value)
--I assume each column is nullable except of ID
INSERT INTO ANOTHER_TABLE VALUES (single_row.id, column_name, column_value);
END LOOP;
END;
したがって、たとえば、MY_TABLEが2行が含まれている場合:私のスクリプトを実行した後
ID|ABC1|DA23|EE123|...
1|123|456|789|...
2|321|654|987|...
は、私のANOTHER_TABLEは含まれています:
MY_TABLE_ID|COLUMN_NAME|COLUMN_VALUE
1|ABC1|123
1|DA23|456
1|EE123|789
... other columns from row 1
2|ABC1|321
2|DA23|654
2|EE123|987
... other columns from row 2
方法私がすることができます?私は、Oracle 11gのを使用してい
EDITは
@vkpは、優れたソリューションを提供しますが、解決するためのもう一つのことがあります。 in
節にすべての列を指定する必要はありません。私は、それらのすべてをリストすることを強制されないように、何らかの種類のクエリを使用したり、または何か他のものを使用したいと考えています。
select *
from MY_TABLE t
unpivot (
column_value for column_name in (select column_name
from user_tab_columns
where table_name = 'MY_TABLE'
and nullable = 'Y')
) u
を、それはエラーを返します:
私はこのような何かを試してみました
ORA-00904: : invalid identifier
00904. 00000 - "%s: invalid identifier"
あなたが心配すべてが個別に各列を入力する必要がされている場合は、その理由だけで列を生成し、クエリを記述していません。ヒント:all_tab_columnsには、各テーブルの列のリストが含まれています... – Boneist
@Boneist私はそれを試しましたが、エラーを返します – ilovkatie
いいえ、別々にクエリを実行し、手動でピリオドをピリオドにして、unpivotクエリの関連する句に手動で貼り付けます。 – Boneist