#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');
Точка в этом нарушает правила именования объектов базы данных:
- Идентификаторы без кавычек могут содержать только буквенно-цифровые символы из вашего набора символов базы данных и символ подчеркивания (_). Ссылки на базу данных могут содержать точки (.) и знаки «at» (@).
таким образом, имя таблицы должно быть заключенным в кавычки идентификатором. Поэтому вам необходимо указать его в своих заявлениях:
EXECUTE IMMEDIATE 'delete "' || v_tab_name || '"';
и
EXECUTE IMMEDIATE 'insert into "' || v_tab_name
|| '"(select * from OFFERINGWORKSPACE."'||v_tab_name ||"')';
db<>fiddle, показывающий ошибки этих команд (упрощенные до одной схемы и статического SQL), и как добавление двойных кавычек их исправляет.