在Oracle SQL语句中构建逗号分隔的值列表

在Oracle SQL语句中构建逗号分隔的值列表,oracle,select-into,Oracle,Select Into,我试图从Oracle中的字段中构建一个逗号分隔的值列表 我找到了一些这样做的示例代码: DECLARE @List VARCHAR(5000) SELECT @List = COALESCE(@List + ', ' + Display, Display) FROM TestTable Order By Display 但是当我尝试这样做时,我总是会得到一个关于FROM关键字notbeing的错误。我可以使用SELECT INTO,它可以工作,但是如果我有多行,我会得到fetch错误 为什么我

我试图从Oracle中的字段中构建一个逗号分隔的值列表

我找到了一些这样做的示例代码:

DECLARE @List VARCHAR(5000)
SELECT @List = COALESCE(@List + ', ' + Display, Display)
FROM TestTable
Order By Display
但是当我尝试这样做时,我总是会得到一个关于FROM关键字notbeing的错误。我可以使用SELECT INTO,它可以工作,但是如果我有多行,我会得到fetch错误

为什么我不能这样做:

SELECT myVar = Field1
FROM myTable

不能在单个变量中插入多个值,除非以某种方式连接它们

要仅获取一个值,但不确定oracle语法

select @myVar = select top 1 Field1 From myTable 否则,要再次连接这些值,请不要确定Oracle

set @myVar = '' -- Get rid of NULL select @myVar = @MyVar + ', ' + Field1 From myTable
不能在单个变量中插入多个值,除非以某种方式连接它们

要仅获取一个值,但不确定oracle语法

select @myVar = select top 1 Field1 From myTable 否则,要再次连接这些值,请不要确定Oracle

set @myVar = '' -- Get rid of NULL select @myVar = @MyVar + ', ' + Field1 From myTable
在Oracle中,您可以使用Tim Hall在此页面上收集的众多数据之一

如果您使用的是11.2

SELECT LISTAGG(display, ',') WITHIN GROUP (ORDER BY display) AS employees
  INTO l_list
  FROM TestTable
在早期版本中,我更倾向于使用用户定义的聚合函数方法,Tim的方法称为string_agg to do


在Oracle中,您可以使用Tim Hall在此页面上收集的众多数据之一

如果您使用的是11.2

SELECT LISTAGG(display, ',') WITHIN GROUP (ORDER BY display) AS employees
  INTO l_list
  FROM TestTable
在早期版本中,我更倾向于使用用户定义的聚合函数方法,Tim的方法称为string_agg to do


可以尝试DBMS_UTILITY.COMMA_TO_TABLE和TABLE_TO_COMMA TO split/join csv:

DECLARE
  l_list1   VARCHAR2(50) := 'Tom,Dick,Harry,William';
  l_list2   VARCHAR2(50);
  l_tablen  BINARY_INTEGER;
  l_tab     DBMS_UTILITY.uncl_array;
BEGIN
  DBMS_OUTPUT.put_line('l_list1 : ' || l_list1);

  DBMS_UTILITY.comma_to_table (
     list   => l_list1,
     tablen => l_tablen,
     tab    => l_tab);

  FOR i IN 1 .. l_tablen LOOP
    DBMS_OUTPUT.put_line(i || ' : ' || l_tab(i));
  END LOOP;

  DBMS_UTILITY.table_to_comma (
     tab    => l_tab,
     tablen => l_tablen,
     list   => l_list2);

  DBMS_OUTPUT.put_line('l_list2 : ' || l_list2);
END;

可以尝试DBMS_UTILITY.COMMA_TO_TABLE和TABLE_TO_COMMA TO split/join csv:

DECLARE
  l_list1   VARCHAR2(50) := 'Tom,Dick,Harry,William';
  l_list2   VARCHAR2(50);
  l_tablen  BINARY_INTEGER;
  l_tab     DBMS_UTILITY.uncl_array;
BEGIN
  DBMS_OUTPUT.put_line('l_list1 : ' || l_list1);

  DBMS_UTILITY.comma_to_table (
     list   => l_list1,
     tablen => l_tablen,
     tab    => l_tab);

  FOR i IN 1 .. l_tablen LOOP
    DBMS_OUTPUT.put_line(i || ' : ' || l_tab(i));
  END LOOP;

  DBMS_UTILITY.table_to_comma (
     tab    => l_tab,
     tablen => l_tablen,
     list   => l_list2);

  DBMS_OUTPUT.put_line('l_list2 : ' || l_list2);
END;

如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮{},以很好地格式化和语法突出显示它!如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮{},以很好地格式化和语法突出显示它!此实用程序的可能副本仅适用于符合Oracle命名约定的令牌,长度为30个字符,不能以数字开头,等等,或者至少以前是这样。它可能在数据库的更高版本中发生了变化-我已经多年没有使用它了。@APC:我想显示我的年龄;-我真的没那么老,但我有时觉得自己老了,特别是在读一些关于SO的问题。对不起,VBAHole,我对SO问题的评论不是针对你的!此实用程序仅适用于符合Oracle命名约定的令牌,长度为30个字符,不能以数字开头,等等,或者至少以前是这样。它可能在数据库的更高版本中发生了变化-我已经多年没有使用它了。@APC:我想显示我的年龄;-我真的没那么老,但我有时觉得自己老了,特别是在读一些关于SO的问题。对不起,VBAHole,我对SO问题的评论不是针对你的!