如何在Oracle SQL(Oracle Forms 12c)中将多个列值组合为单个值,作为逗号分隔的字符串



我有一个名为Data的表,如下

g_name    g_id      v_data    
-----     ----      ------
Test      123        ABC
Test      123        DEG
Test      123        None
Test      123        
Test      123        HIJ

我想要一个选择查询,它会返回如下值(在Oracle数据库中(:

Value
------------
Test,123,ABC
Test,123,DEG
...
...
...
  • LISTAGG()函数在Oracle Forms Builder 12c中不起作用。

  • 可能有3列以上。因此,我需要一种动态的方式将所有列组合在一起。

有人能帮我吗?

您可以连接值:

select g_name || ',' || g_id || ',' || v_data 
from t

如果您可以选择在数据库中创建函数,也许您可以检索函数的结果作为要执行的查询

让我给你看一个例子:

1.我创建了一个有6列的表。

create table test.mytest ( c1 number, c2 number , c3 number, c4 varchar2(10) , c5 number, c6 number );

2.我创建了一个函数来检索查询(或者你可以作为匿名plsql块调用(

create or replace function test.p_gen_query ( powner in varchar2 , ptable in varchar2, p_pretty in varchar2 default 'N' )
return clob
as
vowner     varchar2(40)  := upper(powner);
vtable     varchar2(128) := upper(ptable);
vconta     pls_integer;
vsql       clob;
out_string varchar2(128);
cursor c_tab_columns
is
select column_name, count(*) over () tot_rows
from all_tab_columns where table_name = vtable and owner = vowner
order by column_id;
begin
vsql := ' select ' ;
for item in c_tab_columns
loop
out_string := item.COLUMN_NAME;
if c_tab_columns%rowcount = 1 then
dbms_lob.append(vsql,out_string||' || '','' || ');
elsif c_tab_columns%rowcount < item.tot_rows then
dbms_lob.append(vsql,out_string||' || '','' || ');
else
dbms_lob.append(vsql,out_string||' from '||vowner||'.'||vtable||' ');
end if;
end loop;
if p_pretty = 'Y'
then
dbms_lob.append(vsql,''||chr(10)||'');
dbms_lob.append(vsql,' ; ');
end if;
return vsql;
end;
/

3.调用p_prey为'N'的函数(检索不带sql终止符的查询(

SQL> set long 99999999 longchunksize 9999 lines 9999 pages 0
SQL> select test.p_gen_query ( 'TEST' , 'MYTEST' ) from dual ;
select C1 || ',' || C2 || ',' || C3 || ',' || C4 || ',' || C5 || ',' || C6 from TEST.MYTEST

4.调用p_prey为'Y'的函数,得到sql终止符

SQL> select test.p_gen_query ( 'TEST' , 'MYTEST' , 'Y' ) from dual ;
select C1 || ',' || C2 || ',' || C3 || ',' || C4 || ',' || C5 || ',' || C6 from TEST.MYTEST
;

通过这种方式,您可以将它用于任何想要以这种方式构建的查询。我想您可以从Oracle Forms中检索结果。

请执行级联

select g_name||','||g_id||','||v_data from data;

您可以在plsql中编写一个动态查询并实现这一点。

select LISTAGG(column_name, ',') WITHIN GROUP (ORDER BY column_name) as colum_name from cols where table_name = 'DATA'; 

使用into子句将此结果传递给列。

首先,您需要表的主键列(调用id,我将其作为列列表中的第一列(。

然后,您需要创建一个包含LISTAGG()函数的存储函数,该函数将用于组合从其中一个字典视图派生的列名,通过连接提供列名(如user_tab_columnsuser_tab_cols或仅col(,以及动态查询,为每个id值返回连接的列。

因此,通过在数据库中创建函数;

CREATE OR REPLACE FUNCTION get_value( i_id Data.id%type ) RETURN VARCHAR2 IS 
v_out   VARCHAR2(32767); 
BEGIN
SELECT LISTAGG(column_name, '|| '','' ||') WITHIN GROUP (ORDER BY column_id)
INTO v_out
FROM cols 
WHERE table_name = 'DATA'
AND column_id > 1; 

EXECUTE IMMEDIATE 'SELECT '||v_out||' FROM Data WHERE id = :v_id' INTO v_out USING i_id; 
RETURN v_out;
END;
/

从Forms调用作为常规查询语句:

SELECT id, get_value( id ) AS value
FROM Data 

演示

最新更新