私はこの表を以下の形式で持っています:
Persnbr | Userfieldcd | Value
01 | Port | Funds
01 | Vip1 | Systems
02 | Port | Bank
02 | Vip1 | Authority
これは私がそれを望む方法です:
Persnbr | Port | Vip1
01 | Funds | Systems
02 | Bank | Authority
Userfieldcd列のすべてのフィールドがわからないので、テーブルを動的にピボットしようとしています。したがって、私はこのプロシージャを使用していますが、PL/SQL開発者でそれを呼び出す方法がわかりません。 Oracle Database 11g Enterprise Editionリリース11.2.0.2.0-64ビット本番を使用しています
CREATE OR REPLACE procedure dynamic_pivot_po(p_cursor in out sys_refcursor)
as
sql_query varchar2(1000) := 'select persnbr ';
begin
for x in (select distinct userfieldcd from persuserfield order by 1)
loop
sql_query := sql_query ||
' , min(case when userfieldcd = '''||x.userfieldcd||''' then value else null end) as '||x.userfieldcd;
dbms_output.put_line(sql_query);
end loop;
sql_query := sql_query || ' from persuserfield group by persnbr order by persnbr';
dbms_output.put_line(sql_query);
open p_cursor for sql_query;
end;
/
私が使用してプロシージャを呼び出すとき:
VARIABLE x REFCURSOR
BEGIN
dynamic_pivot_po(:x)
END
/
それは私にくれます
ORA-00900:SQL文が無効です。
PIVOT演算子を使用して実行できますが、すべてのピボット値をハードコーディングする必要があります。
select * from (select Persnbr, Userfieldcd, value from pivot_test) pivot (max(value) for Userfieldcd in ('Port', 'Vip1'));
例として動的にクエリを構築する:
declare
in_clause varchar2(256);
sel_query varchar2(256);
n number := 0;
begin
for x in (select distinct userfieldcd from persuserfield)
loop
if n <> 0 then
in_clause := in_clause || ', ';
end if;
in_clause := in_clause || '''' || x.userfieldcd || '''';
n := 1;
end loop;
sel_query := 'select * from (select Persnbr, userfieldcd, value from persuserfield) pivot (max(value) for userfieldcd in ('||in_clause||'));';
dbms_output.put_line (sel_query);
end;
/
セミコロンがありません:
VARIABLE x REFCURSOR
BEGIN
dynamic_pivot_po(:x); -- here
END; -- and here
/