2017-12-27 892 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

相关问题