Код ошибки ORA-00933 для моей хранимой процедуры

#oracle #plsql #oracle-apex

#Oracle #plsql #oracle-apex

Вопрос:

Я получаю следующее сообщение об ошибке в созданной мной хранимой процедуре:

ORA-00933: команда SQL не завершилась должным образом
ORA-06512: в строке 11

Я попытался погуглить, но не смог найти ничего подходящего, поскольку он говорит мне попытаться устранить любой «ПОРЯДОК ПО».

 declare
    cursor a_tab is
       select table_name
         from all_tables
        where owner = 'OFFERINGWORKSPACE'
          and (TABLE_NAME like 'EBA_%' or TABLE_NAME = 'SURVEY_2.0');

    v_tab_name  varchar2(500);
begin
    open a_tab;
    loop
        fetch a_tab into v_tab_name;
        exit when a_tab%notfound;
    
        EXECUTE IMMEDIATE 'delete ' || v_tab_name;
    end Loop;
    close a_tab;
    
    open a_tab;
    Loop 
        fetch a_tab into v_tab_name;
        Exit when a_tab%notfound;
    
        EXECUTE IMMEDIATE 'insert into ' || v_tab_name || '(select * from OFFERINGWORKSPACE.'||v_tab_name ||')';
    End Loop;
    Close a_tab;
End;
  

Ответ №1:

В вашем запросе курсора есть подсказка:

 ... TABLE_NAME = 'SURVEY_2.0');
  

Точка в этом нарушает правила именования объектов базы данных:

  1. Идентификаторы без кавычек могут содержать только буквенно-цифровые символы из вашего набора символов базы данных и символ подчеркивания (_). Ссылки на базу данных могут содержать точки (.) и знаки «at» (@).

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

 EXECUTE IMMEDIATE 'delete "' || v_tab_name || '"';
  

и

 EXECUTE IMMEDIATE 'insert into "' || v_tab_name
  || '"(select * from OFFERINGWORKSPACE."'||v_tab_name ||"')';
  

db<>fiddle, показывающий ошибки этих команд (упрощенные до одной схемы и статического SQL), и как добавление двойных кавычек их исправляет.