如何在oracle sql(oracle forms 12c)中将多个列值合并为单个值(以逗号分隔的字符串)

6mw9ycah  于 2021-07-26  发布在  Java
关注(0)|答案(4)|浏览(339)

我有一个名为data的表,如下所示

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

我需要一个select查询,它返回如下值(在oracle数据库中):

Value
------------
Test,123,ABC
Test,123,DEG
...
...
...
``` `LISTAGG()` 函数在中不起作用 `Oracle Forms Builder 12c` .
可能有3列以上。因此,我需要一种动态的方式来将所有列组合在一起。
有人能帮帮我吗?
3gtaxfhh

3gtaxfhh1#

您可以指定以下值:

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

hujrc8aj2#

如果您有一个在数据库中创建函数的选项,那么您也许可以将函数的结果检索为要执行的查询
我举个例子:
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\u pretty为'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\u pretty作为'y'调用函数,以使用sql终止符获取它

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

通过这种方式,您可以将它用于任何希望以这种方式构建的查询。我想你可以从oracle表单中检索结果。

4nkexdtk

4nkexdtk3#

请执行连接

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 条款。

myss37ts

myss37ts4#

首先,您需要一个主键列(call) id 我将其假定为表的列列表中的第一列。
然后您需要创建一个存储函数,其中包含 LISTAGG() 函数,该函数将用于组合从给定列名的某个字典视图派生的列名,例如 user_tab_columns , user_tab_cols 或者只是 col 通过concatenetion和动态查询返回每个 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;
/

并作为常规查询语句从窗体调用:

SELECT id, get_value( id ) AS value
  FROM Data

演示

相关问题