2017-12-27 805 views
1

在Oracle Database 12c上使用PL/SQL。PL/SQL:如何將行組合成一個字符串

我有這樣的一個表:

filename | priority       
---------- ----------- 
foo | 1   
bar | 2 
baz | 3  

我要創建這個字符串:FOO,1條,2,巴茲,3

什麼是做到這一點的最好方法是什麼?以前我用SQL Server和這工作:

DECLARE 
    @str varchar(100) 
SELECT @str = COALESCE(@str + ', ', '') + CONCAT(filename, ', ', priority) 
FROM table_name; 

但我想現在要做到這一點在Oracle中,我無法得到它的工作。我已經嘗試了一些方法,如:

DECLARE 
    str varchar(100) := coalesce(str || ', ', '') || CONCAT(filename, ', ', priority) 
FROM table_name; 

但我得到了這個錯誤,:「期待的下列之一,當‘

我也試着像LISTAGG’PLS-00103出現符號」 FROM :

listagg(filename|| ',' || priority, ',') within group (order by priority) as str 
from table_name; 

這給我的錯誤,「PLS-00103:出現符號‘在’在需要下列之一時」

我在做什麼錯?

+0

'DECLARE ... FROM TABLE_NAME' ??? –

+0

爲什麼你需要一個過程(和PL/SQL)代碼?你可以用普通的SQL來做到這一點。那麼 - 爲什麼你需要這樣做?可能有(很多)更好的方法來做你需要的東西;如果你能解釋爲什麼你需要它,我們可能會提供幫助。 – mathguy

+0

我正在修改用PL/SQL編寫的現有代碼以包含新功能。 – Murasaki

回答

2

Oracle中的存儲過程由聲明部分和執行部分組成。您可以使用DECLARE部分來聲明變量,程序使用BEGINEND。使用SELECT INTO爲您的變量選擇一個值。

DECLARE 
    v_str varchar(10000); 
BEGIN 
    select 
    listagg(filename || ',' || priority, ',') within group (order by priority) 
    into v_str 
    from table_name; 

    ... 
END; 
+0

謝謝!我沒有意識到這個聲明不能和執行代碼在同一個塊中。 – Murasaki

相關問題