2010-10-14 159 views
3

在這裏,我與一些PLSQL再次去..PLSQL返回值

我想知道,如果有什麼辦法,我可以用這樣一個選擇以下功能,而不必把它變成一個函數或過程(所以我可以從包含它的腳本中看到代碼)。

的代碼將是這樣的:

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。

+0

ps .:是的,我知道我有一個剩餘的「,」在字符串的開頭-_- – filippo 2010-10-14 14:18:43

回答

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 
+0

那我的朋友,是因爲我太新手了,不知道像'sys_connect_by_path'這樣的美女:)非常感謝你許多!奇蹟般有效。 F。 – filippo 2010-10-14 15:02:47

+0

+1,很好的答案,很好的說明CONNECT BY PRIOR。我在一張桌子上嘗試過這種方法,但它不會產生與OP相同的答案,但我認爲這個概念是正確的,我沒有時間去調試它。 – DCookie 2010-10-14 15:39:56

+0

ops ...我認爲這將是可預測的,但我有這個錯誤'ORA-01489'(輸出字符串太長)。那麼,我認爲在代碼中處理這個問題會更好,但爲了以防萬一,你會對此有何建議? – filippo 2010-10-19 17:02:38

0

另一種選擇是定義一些輸入/輸出變量,而不是return將結果值賦給輸出變量。