我有一个名为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_columns
、user_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
演示