ここで、PLSqlをもう一度使用します。
次の関数を関数やプロシージャに変換せずにselectのように使用できる方法があるかどうかを知りたいです(コードが含まれているスクリプトからコードを確認できます)。
コードは次のようになります。
DECLARE
outpt VARCHAR2(1000) := '';
flow_rI VARCHAR2(50);
CURSOR flow_r IS
select flow_run_id
from table
where CREATED_DATE < sysdate - 32
and rownum < 10
order by 1 desc;
BEGIN
OPEN flow_r;
LOOP
FETCH flow_r INTO flow_rI;
EXIT WHEN flow_r%notfound;
BEGIN
outpt := outpt || ',' || flow_rI;
EXCEPTION
WHEN no_data_found THEN
dbms_output.Put_line(outpt);
END;
END LOOP;
dbms_output.Put_line(outpt);
outpt := '';
CLOSE flow_r;
END;
アイデアは単純です。クエリからのテーブルの結果ではなく、自分から一連のコードを取得したいのですtable
が、結果を"1234,2434,424,45,767,43"
ある種のもののようにフォーマットします。これは、コードの後半で、単純にを実行できる別のクエリなど、さまざまな目的で使用されin ([variable with that string])
ます。
を使用するdbms_output.Put_line(outpt);
と、アプリケーション層からアクセスできず、plsqlではreturn
関数に変換せずにを使用できないようです。
誰かアイデアがありますか?スクリプトにコード全体を含めることができる限り、そのようなPlSqlである必要はありません。
ありがとう!
f。オラクルストリングplsqlシェアこの質問を改善するフォローする2017年10月1日22:13に編集ウィリアムロバートソン11.9k33つのゴールドバッジ3030枚のシルバーバッジ3636個のブロンズバッジ2010年10月14日14:16に 尋ねたフィリッポ5,1631212個のゴールドバッジ4646個のシルバーバッジ6868個のブロンズバッジ
- ps。:ええ、文字列の先頭に「、」が残っていることはわかっています-_- – filippo 2010年 10月14日14:18
3つの答え
SQLだけを使用しないのはなぜですか。
SELECT MAX(ltrim(sys_connect_by_path(flow_run_id, ','), ','))
FROM
(
select flow_run_id, rownum rn
from table
where CREATED_DATE < sysdate - 32
and rownum < 10
order by 1 desc
)
START WITH rn = 1
CONNECT BY PRIOR rn = rn - 1
シェアこの答えを改善するフォローする2010年10月14日15:45に編集2010年10月14日14:25に 回答Michael Pakhantsov22.8k55つのゴールドバッジ5555個のシルバーバッジ5757個のブロンズバッジ
- 私の友達は、私が初心者なので、次のような美しさを知ることができないからです
sys_connect_by_path
:)どうもありがとうございました!チャームのように機能します。f。 – filippo 2010年 10月14日15:02 - +1、いい答え、CONNECTBYPRIORの良いイラスト。私が持っているテーブルでこれを試しましたが、OPと同じ答えは得られませんが、概念は正しいと思い、デバッグする時間がありません。 – dCookie 2010年 10月14日15:39
- ops …これは予測可能だと思いますが、このエラーが発生しました
ORA-01489
(出力文字列が長すぎます)。さて、コードでそれを処理する方が良いと思いますが、念のために、あなたはそれについての提案がありますか? – filippo 2010年 10月19日17:02 - @ flpgdt、sys_connect_by_pathの結果は4000文字(VARCHAR2制限)を超えることはできないため、より長い文字列が必要な場合は、CLOBを返す関数を作成する必要があります – Michael Pakhantsov 2010 年10月20日6:29
- そうですか。ヴィンセントは私にsqlの回避策を教えてくれました(複数の行を使用して、私のために解決します)stackoverflow.com/questions/3975967/…かなり素晴らしい働きをします。ありがとう! – filippo 2010 年10月20日9:37
Oralce 11 r2を使用している場合は、LISTAGGを使用してこれを正確に実行できます http://download.oracle.com/docs/cd/E14072_01/server.112/e10592/functions087.htm
しかし、このサイトには、どのバージョンでも実行できる方法があります(ただし、11r2が理想的な純粋なSQLで実行するには、9i以上である必要があります):http://www.oracle-base.com/articles/misc/StringAggregationTechniques .php(具体的には、Oracle 9iのROW_NUMBER()関数とSYS_CONNECT_BY_PATH関数で純粋なSQLを確認してください)シェアこの答えを改善するフォローする2010年10月14日14:23に 回答ハリソン8,4301ゴールドバッジ1個2929個のシルバーバッジ2828個のブロンズバッジコメントを追加0
別のオプションは、いくつかの入力/出力変数を定義しreturn
、結果値を出力変数に割り当てる代わりになります。