2011-05-26 22 views
3

說我有這樣的事情:是否可以遍歷Oracle中的rowtype字段?

somerecord SOMETABLE%ROWTYPE; 

是否有可能與出會心的字段名稱來訪問somerecord領域? 像somerecord [i]這樣的字段的順序將與表中的列順序相同?

我已經看到了一些使用動態SQL的例子,但我想知道是否有更乾淨的方式來做到這一點。

我想要做的是爲我的表中的特定行生成/獲取DML(插入查詢),但我還沒有能夠找到任何東西。

如果還有另外一種方法可以做到這一點,我會很樂意使用它,但在知道如何處理這個問題的前一部分時也會很好奇 - 它更通用。

感謝

+0

只是好奇,爲什麼不將數據轉儲到平面文件,然後使用sqlldr(或數據泵)加載?可能是一個比運行插入語句的腳本更好的方法。 – tbone 2011-05-27 12:05:18

回答

2

這並不完全回答你問的問題,但可能會得到你想要的結果...

您可以查詢USER_TAB_COLUMNS視圖(或其他類似的* _TAB_COLUMN觀點)以獲取可能用於生成DML的表(或視圖)中列的信息,如列名稱(COLUMN_NAME),位置(COLUMN_ID)和數據類型(DATA_TYPE)。

您仍然需要使用動態SQL來執行生成的DML(或者至少分別生成靜態SQL)。

但是,這種方法不適用於識別任意查詢中的列(除非您創建它的視圖)。如果你需要,你可能需要求助於DBMS_SQL(或其他工具)。

希望這會有所幫助。

1

據我所知,沒有乾淨的方式通過索引來引用記錄字段。但是,如果您有許多不同種類的更新,每個更新都有其自己的列集進行更新,您可能想要避免動態SQL,並查看靜態填充記錄值的方向,以及然後發行update someTable set row = someTableRecord where someTable.id = someTableRecord.id;

這種方法有它自己的缺點,比如對每個甚至是不變的列都發布更新,從而創建額外的重做日誌數據,但我相信應該考慮它。