Как объединить более одного значения столбца в одно значение в виде строки, разделенной запятыми, в Oracle SQL (Oracle Forms 12 c) - PullRequest
2 голосов
/ 14 июля 2020

У меня есть таблица с именем 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 столбцов. Таким образом, мне нужен способ динамического c, чтобы объединить все столбцы вместе.

Может ли кто-нибудь помочь мне здесь?

Ответы [ 5 ]

0 голосов
/ 15 июля 2020

Есть хорошая статья , решающая вашу проблему (первая часть статьи).

0 голосов
/ 15 июля 2020

Прежде всего, вам нужен столбец первичного ключа (вызов id , который я предполагаю как первый столбец в списке столбцов ) для таблицы.

Затем вам нужно создать сохраненную функцию, которая содержит обе функции LISTAGG(), которые будут использоваться для объединения имен столбцов, полученных из одного из представлений словаря, давая имена столбцов, такие как user_tab_columns, user_tab_cols или просто col посредством объединения, и Dynami c Запрос, возвращающий объединенные столбцы для каждого значения 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 

Демо

0 голосов
/ 14 июля 2020

Выполните объединение

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

Вы можете написать динамический c запрос в pl sql и добиться этого.

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

Передайте этот результат в столбец, используя into пункт.

0 голосов
/ 14 июля 2020

Если у вас есть возможность создать функцию в своей базе данных, возможно, вы сможете получить результат функции в виде запроса, который хотите выполнить

Позвольте мне показать вам пример:

1. Я создаю таблицу с 6 столбцами.

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

2. Я создаю функцию для получения запроса (или вы можете вызывать как анонимный блок pl sql)

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_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_pretty как 'Y', чтобы получить ее с sql terminator

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

Таким образом, вы можете использовать его для любого запроса, который вы хотите построить таким образом. Я думаю, вы можете получить результат из Oracle Forms.

0 голосов
/ 14 июля 2020

Вы можете объединить значения:

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