私が Oracle を旅していたとき、その場で動的 SQL クエリを作成しなければならなかったとき、'stragg' 関数、または 'String Aggregator' は命を救ってくれました。
ここでそれについて読むことができます: http://www.oratechinfo.co.uk/delimited_lists_to_collections.html
それの基本的な使用法は次のとおりです。
select stragg(fruit) from food;
fruit
-----------
apple,pear,banana,strawberry
1 row(s) returned
とても使いやすく、chr(13) を連結すると長いリストになり、システム テーブルから情報を選択すると、動的に生成された SQL (監査トリガーなど) に対する 5 分のソリューションが得られました。
現在、私は監査に関連するオラクルの機能を Sybase に移行する責任を負っています。この目的には、Stragg に似た機能が理想的です。
例えば
select @my_table = 'table_of_fruit'
select 'insert into '+@mytable+'_copy (' +char(10)
+ stragg(c.name) +char(10)
+ 'select '
+ stragg('inserted.'+c.name) + char(10)
+ 'from '+@mytable
from syscolumns c
where objectid(@mytable) = c.id
------------------------------------------
insert into table_of_fruit_copy
(fruit, sweetness, price)
select fruit, sweetness,price
from inserted
終わり。単純。
ただし、文字列集計関数を Sybase で動作させる方法がわかりません。
この種のことをしようとする試み、またはこの方法で使用できる stragg と同じように機能するコードを知っている人はいますか?
現時点での代替手段は、複雑なカーソルなどに基づいてコードを出力すること (サンプル LOC: 500)、または静的文字列とユーザー テーブルの列を組み合わせた select ステートメント (サンプル LOC: 200) です。Stragg はこのコードの複雑さを大幅に軽減し、将来的に大きな助けになるでしょう (サンプル LOC: 誰が知っているか、おそらく 50?)
psシェルスクリプトを介してこれらの選択を呼び出し、ファイルにパイプしてから、iSQLを介してファイルを実行しています。最も良い解決策ではありませんが、代替案よりは優れています。