2012-03-20 2 views
0

以下のスクリプトを記述すると、行8にORA-01722エラーが表示されます。前もって感謝します。ループ内の配列要素を使用するpl/sqlでは、ORA-01722エラーが発生します。

declare 
    type array_t is varray(2) of VARCHAR2(20); 
    array array_t := array_t('5634', '5764'); 

begin 

    for i in 1..array.count loop 
     execute immediate 'select t.musteri_id from tms.isemri t where t.isemri_tarihi = (select max(t.isemri_tarihi) from tms.isemri t where t.hizmet_no = '|| 
     array(i)||') and t.hizmet_no ='|| array(i); 

    end loop; 
    end; 

答えて

0

は即時実行「t.isemri_tarihi =は(から最大(t.isemri_tarihi)を選択tms.isemriトンからt.musteri_idを選択tms.isemri t where t.hizmet_no = '' '|| array(i)||' '')およびt.hizmet_no = '' '||配列(i)|| '' '';

1

あなたの連結SQLは次のようになります。値5634は数ではない文字列であり、これはimplcitly常に動作しません数にhizmet_noキャストするには、Oracleを引き起こすこと

select t.musteri_id from tms.isemri t where t.isemri_tarihi = 
(select max(t.isemri_tarihi) from tms.isemri t where t.hizmet_no = 5634) 
and t.hizmet_no = 5634 

注意。

あなたはこの問題を修正するバインド変数を使用してする必要があります。

declare 
    type array_t is varray(2) of VARCHAR2(20); 
    array array_t := array_t('5634', '5764'); 
    l_musteri_id tms.isemri.musteri_id%type 
begin 

    for i in 1..array.count loop 
     execute immediate 'select t.musteri_id from tms.isemri t 
         where t.isemri_tarihi = (select max(t.isemri_tarihi) 
                from tms.isemri t 
                where t.hizmet_no = :val1) 
         and t.hizmet_no = :val2' 
     into l_musteri_id 
     using array(i), array(i); 

    end loop; 
    end; 
+1

selectにも入力する必要はありませんか? – Ben

+0

@Ben、はい - ありがとう! –