2017-07-25 9 views
0

PIVOT操作を使用したSQL文があります。私がPIVOTに持つ列の最大数は5ですが、4,3,2などは少なくてもかまいません。 カーソルでこれらの列を読み込み、固定変数にどのように割り当てることができますかエラーは発生しません。ORA-01007ピボットSQLから固定変数にカーソル値をフェッチする方法 - エラーORA-01007

... 
sql_stmt := 'select * from 
       (select codcoligada, 
         idprd, 
         codcfo, 
         valnegociado 
       from tcitmorcamento 
       where codcoligada = ' || p_codcoligada || ' 
        and codcotacao = ' || '''' || p_codcotacao || '''' || ') 
       pivot 
       (
        sum(valnegociado) for codcfo in (' || pivot_clause || ') 
       )'; 

    ret := t_tab_sesa_cotacao(); 

    open vCursor for sql_stmt; 

    loop 
    /* If my cursor returns less than 5 columns in PIVOT the error occurs ORA-01007 */ 
    fetch vCursor into vCodColigada, vIdProduto, vValor01, vValor02, vValor03, vValor04, vValor05; 
    exit when vCursor%NOTFOUND; 
     ret.extend; 
     ret(ret.count) := t_type_sesa_cotacao(vCodColigada, vIdProduto, vValor01, vValor02, vValor03, vValor04, vValor05); 
    end loop; 

    close vCursor; 
... 

5個未満の列を戻す場合は、残りの変数を0またはnullの値で埋めたいとします。

CODCOLIGADA  IDPRD   '000125'   '002272'   '002342'   
----------------- ---------------- ---------------- ---------------- ---------------- 
       1   15464    45    300    30 
       1   18460    35    200    20 
       1   57492    20    100    10 
-------- End of Data -------- 

例:

変数vCodColigadaとvIdProduto

は、1と5(vValor1、vValor2、vValor3、vValor4、vValor5)

結果ピボットSQLの間で変化させることができるだけピボット列が識別されます。 カーソルがPIVOT(上記)の3つの値を返した場合、変数vValor01、vValor02、vValor03が入力され、変数vValor04、vValor05は0またはnullでなければなりません。

例:私はPIVOT 3つの列を持っている、と私は5つの変数を持っていると、ORA-01007エラーが発生して

CODCOLIGADA  IDPRD   VALOR01   VALOR02   VALOR03   VALOR04   VALOR05   
----------------- ---------------- ---------------- ---------------- ---------------- ---------------- ---------------- 
       1   15464    45    300    30    0    0 
       1   18460    35    200    20    0    0 
       1   57492    20    100    10    0    0 
-------- End of Data -------- 

(...に...フェッチ)。

答えて

1

スニペットが役立ちます。この基本的な理解のために、余分な変数をnullまたは空白として追加する必要があります。

SET serveroutput ON; 
DECLARE 
    lv_pivot VARCHAR2(100):='''Y'',''N'''; 
TYPE lv 
IS 
    RECORD 
    (
    flg_y VARCHAR2(100), 
    flg_n VARCHAR2(100), 
    flg_e VARCHAR2(100)); 
type lv_tab 
IS 
    TABLE OF lv; 
    lv_num lv_tab; 
    lv_check VARCHAR2(1000); 
BEGIN 
    lv_check :=regexp_count(lv_pivot,',',1); 
    IF lv_check < 3 THEN 
    FOR z IN 1..(2-lv_check) 
    LOOP 
     lv_pivot:=lv_pivot||',null as val'||z; 
    END LOOP; 
    ELSE 
    lv_pivot:=lv_pivot; 
    END IF; 
    dbms_output.put_line(lv_pivot); 
    EXECUTE IMMEDIATE ' SELECT * FROM       
(SELECT col1 FROM <table> )      
pivot (COUNT(1) FOR col1 IN ('||lv_pivot||'))' BULK COLLECT INTO lv_num; 
END; 


---------------------------Refactoring in Function------------------------------ 

--Create Object Type 
CREATE OR REPLACE TYPE lv_obj IS OBJECT 
(
     flg_y VARCHAR2(100), 
     flg_n VARCHAR2(100), 
     flg_e VARCHAR2(100) 
); 

--Create Table Type 
CREATE OR REPLACE TYPE lv_tab IS TABLE OF lv_obj; 

--Create Function 
CREATE OR REPLACE 
    FUNCTION test_func 
    RETURN lv_tab 
    AS 
    lv_pivot VARCHAR2(100):='''Y'',''N'''; 
    lv_num lv_tab; 
    lv_check VARCHAR2(1000); 
    BEGIN 
    lv_check :=regexp_count(lv_pivot,',',1); 
    IF lv_check < 3 THEN 
     FOR z IN 1..(2-lv_check) 
     LOOP 
     lv_pivot:=lv_pivot||',null as val'||z; 
     END LOOP; 
    ELSE 
     lv_pivot:=lv_pivot; 
    END IF; 
    dbms_output.put_line(lv_pivot); 
    EXECUTE IMMEDIATE ' SELECT * FROM       
(SELECT col1 FROM <table> )      
pivot (COUNT(1) FOR col1 IN ('||lv_pivot||'))' BULK COLLECT INTO lv_num; 
    RETURN lv_tab; 
    END; 

-------------------------------------------------Output----------------------------------------------- 

SELECT * FROM TABLE(test_func); 
------------------------------------------------------------------------------------------------------- 
+0

ありがとうございました。ソリューションは機能しました。この型(lv_num)を関数でどのように返すことができますか? –

+0

私は関数の出力をリファクタリングしました。それが役に立てば幸い。 –

+0

ありがとうございました。 ORA-00932:一貫性のないデータ型:expected-got- –

-1

クエリで結果を埋めてください。 5つの列すべてを戻すselectステートメントにjoinを追加します。

+0

ください。例を挙げていただけますか? –

関連する問題