PL / SQL ORA-00903: неверное имя таблицы во время EXECUTE IMMEDIATE - PullRequest
0 голосов
/ 15 января 2020

вот мой код:

procedure test IS 
  tn varchar2(99);
  i number(6);
  cursor c1 is
    select tname
    from   tab
    where  tabtype='TABLE'
    and    tname NOT LIKE 'BIN%'
    order by tname;
begin
  open c1;
  loop
    fetch c1 into tn;
    exit when c1%notfound;
    sq3 := 'select count(*) from '||tn;
    EXECUTE IMMEDIATE sq3 INTO i;
    htp.anchor2('XXX.test2?tabl='||tn,tn||' = '||i,'F3','F3');
  end loop;
  close c1;
end test;

после выполнения я получаю ошибку

Failed to execute target procedure
ORA-00903: invalid table name

для этой строки "EXECUTE IMMEDIATE sq3 INTO i;"

Любые идеи почему?

Заранее спасибо!

1 Ответ

3 голосов
/ 15 января 2020

Ошибка не требует пояснений:

Недопустимо одно из имен таблиц, для которых вы пытаетесь сосчитать количество строк.

Вы можете использовать следующий код для перехвата исключения и определите имя таблицы (вам также нужно объявить переменную sq3):

procedure test
IS
  sq3 CLOB;
  tn  varchar2(99);
  i   number(6);
  cursor c1 is
    select tname
    from   tab
    where  tabtype='TABLE'
    and    tname NOT LIKE 'BIN%'
    order by tname;

  invalid_table_name EXCEPTION;
  PRAGMA EXCEPTION_INIT( invalid_table_name, -903 );
begin
  open c1;
  loop
    fetch c1 into tn;
    exit when c1%notfound;
    BEGIN
      sq3 := 'select count(*) from '||tn;
      EXECUTE IMMEDIATE sq3 INTO i;
      htp.anchor2('XXX.test2?tabl='||tn,tn||' = '||i,'F3','F3');
    EXCEPTION
      WHEN invalid_table_name THEN
        DBMS_OUTPUT.PUT_LINE( 'Invalid Table Name: ' || tn );
    END;
  end loop;
  close c1;
end test;

Вы можете обнаружить, что имя таблицы недопустимо, потому что оно чувствительно к регистру или содержит символы, которые обычно не являются ожидается в имени таблицы, и вы не обрабатываете его как таковое в операторе EXECUTE IMMEDIATE. В этом случае вы можете использовать:

sq3 := 'select count(*) from "'||tn||'"';

db <> fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...