PLSql return values

ここで、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個のブロンズバッジ

コメントを追加

3つの答え

アクティブ最古投票9

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 

コメントを追加1

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、結果値を出力変数に割り当てる代わりになります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA