0

以下のスクリプトを記述すると、8行目で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;
4

2 に答える 2

1

連結されたSQLは次のようになります。

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

値5634は文字列ではなく数値であることに注意してください。これにより、Oracleはhizmet_noを数値に暗黙的にキャストしますが、これは常に機能するとは限りません。

バインド変数を使用する必要があります。これにより、この問題が修正されます。

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;
于 2012-03-20T14:52:55.797 に答える
0

即時実行'selectt.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)||''')およびt.hizmet_no='''|| array(i)||'''';

于 2012-03-20T15:11:52.427 に答える