web-dev-qa-db-ja.com

このプロシージャをPL / SQLで実行するにはどうすればよいですか?

私はこの表を以下の形式で持っています:

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文が無効です。

4
Rafey

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;
/
2
vegatripy

セミコロンがありません:

VARIABLE x REFCURSOR  
BEGIN  
   dynamic_pivot_po(:x); -- here
END; -- and here
/