У меня есть некоторый SQL код для заполнения базы данных, которая работает просто отлично:Процедура вызова внутри блока в PL/SQL
INSERT INTO PDF_DOCUMENT_ELEMENT (DOCUMENT_ELEMENT_ID, DOCUMENT_ID, ELEMENT_ID) VALUES (1, 1, 1);
INSERT INTO PDF_DOCUMENT_ELEMENT (DOCUMENT_ELEMENT_ID, DOCUMENT_ID, ELEMENT_ID) VALUES (2, 1, 1);
INSERT INTO PDF_DOCUMENT_ELEMENT (DOCUMENT_ELEMENT_ID, DOCUMENT_ID, ELEMENT_ID) VALUES (3, 1, 2);
EXECUTE RESET_SEQUENCE('DOCUMENT_ELEMENT_ID_SEQ', 4);
Для повышения ремонтопригодности, я пытаюсь заменить некоторые магические числа с переменными. Я никогда не использовал переменные раньше, но я прочитал мне нужно использовать/SQL блок PL так:
DECLARE
ELEMENT_TEXT SMALLINT := 1;
ELEMENT_IMAGE SMALLINT := 2;
BEGIN
INSERT INTO PDF_DOCUMENT_ELEMENT (DOCUMENT_ELEMENT_ID, DOCUMENT_ID, ELEMENT_ID) VALUES (1, 1, ELEMENT_TEXT);
INSERT INTO PDF_DOCUMENT_ELEMENT (DOCUMENT_ELEMENT_ID, DOCUMENT_ID, ELEMENT_ID) VALUES (2, 1, ELEMENT_TEXT);
INSERT INTO PDF_DOCUMENT_ELEMENT (DOCUMENT_ELEMENT_ID, DOCUMENT_ID, ELEMENT_ID) VALUES (3, 1, ELEMENT_IMAGE);
EXECUTE RESET_SEQUENCE('DOCUMENT_ELEMENT_ID_SEQ', 4);
END;
/
Это работает просто отлично, за исключением вызова процедуры:
EXECUTE RESET_SEQUENCE('DOCUMENT_ELEMENT_ID_SEQ', 4);
*
ERROR en lÝnea 45:
ORA-06550: lÝnea 45, columna 9:
PLS-00103: Se ha encontrado el sÝmbolo "RESET_SEQUENCE" cuando se esperaba uno
de los siguientes:
:= . (@ % ; immediate
El sÝmbolo ":=" ha sido sustituido por "RESET_SEQUENCE" para continuar.
PLS- 00103 ошибка переводится как:
PLS-00103: найден 'строка', но ожидалось одно из следующих действий: 'строка'
Если изменить вызов:
EXECUTE IMMEDIATE RESET_SEQUENCE('DOCUMENTO_ELEMENTO_ID_SEQ', 4);
... Я получаю это:
PLS-00222: en este ßmbito no existe ninguna funci¾n cuyo nombre sea
'RESET_SEQUENCE'
ORA-06550: lÝnea 45, columna 1:
PL/SQL: Statement ignored
... что не переводится как:
PLS-00222: нет функции с именем «строка» существует в этой области
Мои вопросы:
- Я использую переменные правильно или есть лучшее решение для моей первоначальной цели?
- Что мне нужно исправить в синтаксисе процедуры вызова и почему?
'execute immediately' нуждается в строке:' EXECUTE IMMEDIATE 'RESET_SEQUENCE (' 'DOCUMENT_ELEMENT_ID_SEQ' ', 4)' '; –
Спасибо всем. Я собрал всю информацию в новый ответ и принял ответ, который дал мне ключ. –