PL / SQL с использованием элементов массива в цикле дает ошибку ORA-01722 - PullRequest
0 голосов
/ 20 марта 2012

Я пишу ниже сценарий и получаю ошибку ORA-01722 в строке 8. Как я могу решить эту ошибку? заранее спасибо.

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;

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Ваш объединенный 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;
0 голосов
/ 20 марта 2012

выполнить немедленно 'select t.musteri_id из tms.isemri t, где t.isemri_tarihi = (выберите max (t.isemri_tarihi) из tms.isemri t, где t.hizmet_no =' '' || array (i) || ''') и t.hizmet_no = '' '||Массив (я) || '' '';

...