英文:
Converting column data into row in pl/sql
问题
嗨,当我去面试的时候,他们问了我这个问题。
创建表格 course(Name CHAR(10));
插入到 course 中的值为 ('Java');
插入到 course 中的值为 ('Oracle');
插入到 course 中的值为 ('Python');
插入到 course 中的值为 ('C');
插入到 course 中的值为 ('C++');
输出结果:
Java Oracle Python C C++
提前感谢,
Sandhya。
英文:
Hi When i went for an interview they asked me this question.
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++
Thanks in advance,
Sandhya.
答案1
得分: 0
你可以使用聚合函数 - LISTAGG
如下所示:
SQL> SELECT
LISTAGG(TRIM(NAME), ' ') WITHIN GROUP(
ORDER BY
NULL
) AS RESULT
FROM
COURSE;
结果
C C++ Java Oracle Python
SQL>
英文:
You can use an aggregate function - LISTAGG
as following:
> SQL> SELECT
> 2 LISTAGG(TRIM(NAME), ' ') WITHIN GROUP(
> 3 ORDER BY
> 4 NULL
> 5 ) AS RESULT
> 6 FROM
> 7 COURSE;
>
> RESULT
> --------------------------------------------------------------------------------
> C C++ Java Oracle Python
>
> SQL>
Cheers!!
答案2
得分: 0
我认为NAME
列的数据类型应该是VARCHAR2
,而不是CHAR
。
无论如何,另一个选项(类似于Tejash的LISTAGG
),它使用XMLAGG
,如果结果超过4000个字符,它更安全。
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块可能如下所示:
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>;
或者 - 类似地 - 一个函数:
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
参数的过程:
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>;
如你所见,有很多选项;选择最适合你需求的一个。
英文:
I presume that NAME
column's datatype should have been VARCHAR2
, not CHAR
.
Anyway, another option (similar to Tejash's LISTAGG
) which uses XMLAGG
and is safer if the result is larger than 4000 characters.
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>
Or, as you tagged the question with PL/SQL tag, then an anonymous PL/SQL block might look like this:
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>
Or - similarly - a function:
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>
Or, a procedure with an OUT
parameter:
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>
As you can see, quite a few options; use the one that most suits your needs.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论