首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在pl/sql中将列数据转换为行

在pl/sql中将列数据转换为行
EN

Stack Overflow用户
提问于 2020-01-06 06:44:15
回答 2查看 274关注 0票数 0

嗨,当我去面试的时候,他们问我这个问题。

代码语言:javascript
复制
    Create table course(Name CHAR(10));

    insert into course values ('Java');
    insert into course values ('Oracle');
    insert into course values ('Python');
    insert into course values ('C');
    insert into course values ('C++');

     o/p:
        Java Oracle python c c++

提前谢谢你,桑迪亚。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-06 09:25:52

我认为NAME列的数据类型应该是VARCHAR2,而不是CHAR

无论如何,另一个选项(类似于Tejash的LISTAGG)使用XMLAGG,如果结果大于4000个字符,则更安全。

代码语言:javascript
复制
SQL> SELECT RTRIM (
  2            XMLAGG (XMLELEMENT (e, name || ' ') ORDER BY null).EXTRACT (
  3               '//text()'),
  4            ',')
  5            result
  6  FROM course;

RESULT
------------------------------------------------------------
Java       Oracle     Python     C          C++

SQL>

或者,当您使用PL/SQL标记标记问题时,匿名PL/SQL块可能如下所示:

代码语言:javascript
复制
SQL> set serveroutput on
SQL>
SQL> declare
  2    l_result varchar2(100);
  3  begin
  4    for cur_r in (select name from course) loop
  5      l_result := l_result ||' '|| cur_r.name;
  6    end loop;
  7
  8    dbms_output.put_line(trim(l_result));
  9  end;
 10  /
Java       Oracle     Python     C          C++

PL/SQL procedure successfully completed.

SQL>

或者--类似地--一种功能:

代码语言:javascript
复制
SQL> create or replace function f_course
  2    return varchar2
  3  is
  4    l_result varchar2(100);
  5  begin
  6    for cur_r in (select name from course) loop
  7      l_result := l_result ||' '|| cur_r.name;
  8    end loop;
  9
 10    return trim(l_result);
 11  end;
 12  /

Function created.

SQL> select f_course from dual;

F_COURSE
--------------------------------------------------------------
Java       Oracle     Python     C          C++

SQL>

或者,带有OUT参数的过程:

代码语言:javascript
复制
SQL> create or replace procedure p_course (par_result out varchar2)
  2  is
  3    l_result varchar2(100);
  4  begin
  5    for cur_r in (select name from course) loop
  6      l_result := l_result ||' '|| cur_r.name;
  7    end loop;
  8
  9    par_result := trim(l_result);
 10  end;
 11  /

Procedure created.

SQL> declare
  2    l_out varchar2(100);
  3  begin
  4    p_course(l_out);
  5    dbms_output.put_line(l_out);
  6  end;
  7  /
Java       Oracle     Python     C          C++

PL/SQL procedure successfully completed.

SQL>

正如您所看到的,有很多选择;使用最适合您需要的选项。

票数 0
EN

Stack Overflow用户

发布于 2020-01-06 06:52:47

您可以使用聚合函数- LISTAGG,如下所示:

SQL>选择组内2个LISTAGG(TRIM(NAME),‘') (3阶乘4 NULL 5)作为结果6;结果C++ SQL>

干杯!!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59607761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档