2017-09-26 7 views
0

から収集は、バルクがREFカーソルから収集フェッチしている間、私は一貫性のないデータ型エラーを取得していますREFカーソル

はここ

create or replace function test_func(c in int) return number as 

v_stmt varchar2(4000); 
v_insert varchar2(4000); 
k_col_name varchar2(50); 
v_gs_tab_name varchar2(100); 
min_k_val varchar2(50); 
max_k_val varchar2(50); 
mid_k_val varchar2(50); 
nxt_mid_k_val varchar2(50); 
type l_cursor_type is ref cursor; 
l_cursor l_cursor_type; 
type t_source is table of rec_source; 
    m_source t_source:=t_source(); 
dat_typ varchar2(50); 

begin 

select DISTINCT data_type INTO dat_typ from all_tab_cols where column_name 
in (SELECT cols.column_name FROM all_constraints cons, all_cons_columns 
cols 
WHERE cons.constraint_type='P' and cols.table_name=+v_tab_name AND 
    CONS.OWNER='SOURCE' 
    AND cons.constraint_name = cols.constraint_name AND cons.owner = 
    cols.owner); 

    dml_str:='create or replace type dwbi_land.rec_source as object (id '||dat_typ||')'; 
     dbms_output.put_line(dml_str); 
     execute immediate dml_str; 
    dml_str:='create or replace type dwbi_land.t_source as table of rec_source'; 
    dbms_output.put_line(dml_str); 
    execute immediate dml_str; 

    begin 
     select 'select * from '||v_gs_tab_name 
     ||' where '||k_col_name||' between ('||min_k_val||') and 
     ('||mid_k_val||')' 
     into v_stmt 
     from dual; 

     dbms_output.put_line(v_stmt); 

     execute immediate v_stmt bulk collect into m_source; 

     v_insert:='insert into '||v_tab_name||' values '||v_stmt||''; 

     dbms_output.put_line(v_insert); 

     open l_cursor for v_stmt; 
     loop 
     fetch l_cursor bulk collect into m_source; 
     exit when l_cursor%NOTFOUND; 
     m_source.extend; 
     forall i in 1..m_source.count 
     execute immediate v_insert using m_source(i).id; 
    commit; 
    exit when m_source.count=0; 
    end loop; 

    select 'select * from '||v_gs_tab_name 
     ||' where '||k_col_name||' between ('||nxt_mid_k_val||') and ('||max_k_val||')' 
    into v_stmt 
    from dual; 

    dbms_output.put_line(v_stmt); 

    v_insert:='insert into '||v_tab_name||' values '||v_stmt||''; 

    dbms_output.put_line(v_insert); 

    open l_cursor for v_stmt using 1; 
    loop 
    fetch l_cursor bulk collect into m_source; 
    forall i in 1..m_source.count 
     execute immediate v_insert using m_source(i).id; 
    commit; 
    exit when m_source.count=0; 
    end loop; 
end; 

ではm_sourceに収集バルクl_cursorフェッチ私のコードです一部は取得中 Ora-00932:不一致のデータ型:expected - got - 提案は大歓迎です

前へ私はコード全体を投稿できませんでした。コード全体

答えて

-1

あなたはplを拡張することができます... は、v_stmtのデータ型にワットを入れますか?

サンプルコード:

begin 
v_stmt:= 'select * from ''||v_gs_tab_name||'' where ''||k_col_name||'' between (''||nxt_mid_k_val||'') and (''||max_k_val||'')'' into v_stmt from dual' 
Dbms_output.put_line(v_stmt); 
V_insert:='insert into '||v_tab_name||' values '||v_stmt||''; 
dbms_output.put_line(v_insert); 

    open l_cursor for v_stmt using 1; loop fetch l_cursor bulk collect into m_source; 

    forall i in 1..m_source.count 

    execute immediate v_insert using m_source(i).id; 

    commit; 

    exit when m_source.count=0; 

    end loop; 

end; 
+0

こんにちは、今私は自分のコードを更新しました – Tilak

+0

たびにアールを確認してください動的クエリを使用すると、variavleに割り当てる必要があります--- ** 'v_stmt:=' select * from '' || v_gs_tab_name || '' '' || k_col_name || '' between( '' || nxt_mid_k_val || '')と( '' || max_k_val || '') 'からv_stmt into double' Dbms_outputに変換します。 put_line(v_stmt); V_insert:= 'insert into' || v_tab_name || '値 '|| v_stmt ||' '; dbms_output.put_line(v_insert); ***役立つことを願っています。 –

+0

こんにちは@Tilak、私は解決策が有益であることを願っています... !!! –

0

あなたは、変数の宣言が欠けているが、あなたがそれを簡素化することができ表示されます。

begin 
    v_stmt := 'insert into ' || v_tab_name 
      || ' select id from '||v_gs_tab_name 
      || ' where '||k_col_name||' between :1 and :2; 

    dbms_output.put_line(v_stmt); 

    execute immediate v_stmt using min_k_val, mid_k_val; 
    execute immediate v_stmt using nxt_mid_k_val, max_k_val; 
END; 
関連する問題