Содержание
- ANT — ошибка выполнения PLSQL
- Ошибка получения неизвестной команды в IF-THEN-ELSE
- 2 ответа
- SP2-0552: Переменная привязки «NEW» не объявлена и отчет об ошибке END — неизвестная команда
- 1 ответ
- ANT — ошибка выполнения PLSQL
- 1 ответ
- ANT — ошибка выполнения PLSQL
ANT — ошибка выполнения PLSQL
У меня есть несколько сценариев sql (некоторые sql и некоторые plsql) для выполнения с помощью ant. Прежде чем я начну выполнение, мне нужно убедиться, что файлы исполняемые. Итак, я запускаю следующую цель, чтобы создать исполняемый файл sql и plsql из ant.
И PLSQL в файле файл выглядит примерно так:
что когда ant target makeExecutableSQLs запускает выходные данные —
но это при запуске позже не работает из-за этой ошибки —
Error starting at line : 1 in command — BEGIN FOR c IN —query LOOP dbms_utility.blah Error report — ORA-06550: line 9, column 135: PLS-00103: Encountered the symbol «end-of-file» when expecting one of the following:
Не могу понять, где ошибка?
Вы спрашиваете, почему возникают ошибки PL / SQL или почему pattern=»;» replace=»$/» повреждает PL / SQL (и тем самым вызывает эти ошибки)?
Я знаю, что replace = «$ /» вызывает ошибку «расширенного» сценария. Но для SQL это работает хорошо. Но пока я хочу знать, почему возникает эта ошибка PLSQL.
В языке PL / SQL в качестве признака конца команды используется ; , а не / , который является оператором деления. Очевидно, что задача состоит в том, чтобы не дать вашему скрипту Ant испортить ваш PL / SQL, вставив в него недопустимые символы. Я не знаю Ant, так что, может быть, это будет действительно сложно.
Ошибки PL / SQL возникают из-за того, что вы заменили разделители операторов PL / SQL точкой с запятой на терминаторы блока.
Когда компилятор видит / , он завершает работу и выполняет команду в буфере, поэтому он видит и пытается скомпилировать и запустить
как автономный полный блок PL / SQL. Как ошибка, которую вы получаете от этого
ORA-06550: line 9, column 135: PLS-00103: Encountered the symbol «end-of-file» .
указывает, что очевидно завершенный блок заканчивается раньше положенного срока. После blah нет терминатора оператора точки с запятой, но также нет end loop или end для блока — в этом коде он пытается выполнить. По сути, он не видел остальной части сценария.
Затем он продолжает и пытается интерпретировать следующий фрагмент.
что также недействительно; клиент даже не пытается выполнить это, потому что не знает, что с этим делать.
Затем следующий кусок
успешно выполняется как простой оператор SQL (управление транзакциями), а не в контексте PL / SQL.
Короче говоря, вы не можете заменить точку с запятой на косую черту в блоке PL / SQL, поскольку они делают разные вещи. В простом SQL они взаимозаменяемы (или, скорее, для большинства клиентов они взаимозаменяемы; по крайней мере, по умолчанию — даже в SQL * Plus вы можете изменить терминатор SQL с точки с запятой на что-то другое).
Клиент по-прежнему обрабатывает косую черту после блока PL / SQL, и когда он видит, что он отправляет блок в базу данных для выполнения. Но хотя он знает, что это блок внутри, он знает, что любые точки с запятой, которые он видит, являются частью языка PL / SQL, и не должен пытаться их интерпретировать.
Это называется в документации SQL * Plus для запуска блоков PL / SQL, и другие клиенты склонны вести себя аналогичным образом.
Execute the current subprogram with a RUN or slash ( / ) command. A semicolon ( ; ) is treated as part of the PL/SQL subprogram and will not execute the command.
Это помогает, мне нужно убедиться, что блок plsql остается неизменным, когда муравей проходит через него.
Источник
Ошибка получения неизвестной команды в IF-THEN-ELSE
У меня есть следующий запрос, который я использую в Oracle 11g
Запустив оператор, я получаю следующий вывод:
Значения вставляются с ошибкой, когда я запускаю его напрямую. Но когда я пытаюсь выполнить этот запрос через свое приложение, я получаю исключение оракула из-за сгенерированной ошибки:
И, следовательно, значения не вставляются.
Я относительно новичок в Oracle. Посоветуйте, пожалуйста, что не так с приведенным выше запросом, чтобы я мог выполнить этот запрос без ошибок.
2 ответа
Если MERGE у вас не работает, попробуйте следующее:
Здесь вы update по спецификации, затем проверьте, нашли ли вы подходящую строку, и insert , если вы этого не сделали.
«что не так с вышеуказанным запросом»
Что не так с запросом, так это то, что это не запрос (SQL). Это должен быть фрагмент программы (PL / SQL), но он не записан как блок PL / SQL, обрамленный ключевыми словами BEGIN и END; .
Но превращение его в анонимный блок PL / SQL не поможет. Oracle PL / SQL не поддерживает синтаксис IF EXISTS (select . .
К счастью, Oracle SQL поддерживает оператор MERGE, который делает то же самое, что и ваш код, с меньшим набором текста.
Кроме того, что вы также пытаетесь обновить empid . Это не поддерживается в MERGE . Почему вы хотите изменить первичный ключ?
«Нужен ли этот запрос для добавления значений во все столбцы таблицы?»
INSERT может иметь все столбцы в таблице. UPDATE не может изменить столбцы, используемые в предложении ON (обычно это первичный ключ), потому что это ограничение работы MERGE. Я думаю, что это тот же механизм сохранения ключей, который мы видим при обновлении представлений. Подробнее . ,
Источник
SP2-0552: Переменная привязки «NEW» не объявлена и отчет об ошибке END — неизвестная команда
Я должен написать триггер для таблиц, которые я сделал, и при обновлении вставки я должен записать отдельную таблицу журнала для тех, которые обновляются или вставляются.
Столбцы в таблице журнала будут такими:
- Done_process (напишет update, вставит)
- Человек (номер студента лица, прошедшего курс лечения)
- До (предыдущее значение для обновления, пусто для вставки)
- После (новое значение для обновления, новое значение для вставки)
Это моя таблица student_info ,
Когда я пытаюсь запустить код, он выдает следующую ошибку:
1 ответ
Я считаю, что вы создаете этот триггер для целей обучения, а не для реального использования, потому что то, что вы делаете в триггере, на самом деле не имеет никакого смысла.
Упомянутый вами триггер не компилируется из-за синтаксических проблем, таких как where v_id := 20201033 .
Предложение Where используется для сравнения значения, поэтому вы должны использовать = вместо := , который является оператором присваивания.
Помимо этой проблемы, есть несколько моментов, о которых еще нужно позаботиться.
- Дайте явное соглашение для создания локальных переменных. например вы создали локальную переменную v_id , и тот же столбец также доступен в таблице student_info . Хотя в данном случае это не проблема, рекомендуется сохранять специфичность локальной переменной, например, l_v_id .
- Вы использовали оператор select внутри триггера, который может привести к ошибке NO_DATA_FOUND , и вы должны обработать его либо в разделе исключений, либо другим способом использовать агрегатную функцию, например max() , если очевидно v_id является первичным ключом. Я сомневаюсь, зачем вам нужен этот оператор выбора (вы могли бы использовать между старым и новым, используя что-то вроде coalesce(:old.school_id,:new_schoold_id) , если бы я вас понял), но я бы оставил это на ваше усмотрение, чтобы решить и действовать соответствующим образом.
Учитывая вышеуказанные пункты, окончательный код будет,
ОТРЕДАКТИРОВАНО: решение проблемы с инструментом
Я сомневаюсь, что проблема связана с использованием инструмента SQL Developer, однако последняя попытка, которую я хотел бы сделать,
Шаг 1: Удалите обе таблицы, используемые с помощью команды drop.
Шаг 2: Откройте другой рабочий лист SQL, используя alt+F10 , и выполните действия, показанные на следующем рисунке. Пожалуйста, попробуйте и дайте мне знать.
Источник
ANT — ошибка выполнения PLSQL
У меня есть несколько сценариев sql (некоторые sql и некоторые plsql) для выполнения с помощью ant. Прежде чем я начну выполнение, мне нужно убедиться, что файлы исполняемые. Итак, я запускаю следующую цель, чтобы создать исполняемый файл sql и plsql из ant.
И PLSQL в файле файл выглядит примерно так:
Что когда ant target makeExecutableSQLs запускает выходные данные —
Но это при запуске позже не работает из-за этой ошибки —
Ошибка при запуске со строки: 1 в команде — НАЧАТЬ FOR c IN —query LOOP dbms_utility.blah Отчет об ошибке — ORA-06550: строка 9, столбец 135: PLS-00103: обнаружен символ «конец файла» при ожидании одного из следующих:
Не могу понять, где ошибка?
1 ответ
Ошибки PL / SQL возникают из-за того, что вы заменили разделители операторов PL / SQL точкой с запятой на терминаторы блока.
Когда компилятор видит / , он завершает работу и выполняет команду в буфере, поэтому он видит и пытается скомпилировать и запустить
Как автономный полный блок PL / SQL. Как ошибка, которую вы получаете от этого
ORA-06550: строка 9, столбец 135: PLS-00103: обнаружен символ «конец файла» .
Указывает, что очевидно завершенный блок заканчивается раньше положенного срока. После blah нет терминатора оператора с запятой, но также нет end loop или end для блока — в том коде, который он пытается выполнить. По сути, он не видел остальной части сценария.
Затем он продолжает и пытается интерпретировать следующий фрагмент.
Что также недействительно; клиент даже не пытается это выполнить, потому что не знает, что с этим делать.
Затем следующий кусок
Успешно выполняется как простой оператор SQL (управление транзакциями), а не в контексте PL / SQL.
Короче говоря, вы не можете заменить точку с запятой на косую черту в блоке PL / SQL, поскольку они делают разные вещи. В простом SQL они взаимозаменяемы (или, скорее, для большинства клиентов они взаимозаменяемы; по крайней мере, по умолчанию — даже в SQL * Plus вы можете изменить терминатор SQL с точки с запятой на что-то другое).
Клиент по-прежнему обрабатывает косую черту после блока PL / SQL, и когда он видит, что он отправляет блок в базу данных для выполнения. Но хотя он знает, что находится внутри блока, он знает, что любые точки с запятой, которые он видит, являются частью языка PL / SQL, и не должен пытаться их интерпретировать.
Об этом упоминается в документации SQL * Plus для запуска Блоки PL / SQL и другие клиенты ведут себя аналогичным образом.
Выполните текущую подпрограмму с помощью команды RUN или косой черты ( / ). Точка с запятой ( ; ) рассматривается как часть подпрограммы PL / SQL и не выполняет команду.
Источник
ANT — ошибка выполнения PLSQL
У меня есть несколько сценариев sql (некоторые sql и некоторые plsql) для выполнения с помощью ant. Прежде чем я начну выполнение, мне нужно убедиться, что файлы исполняемые. Итак, я запускаю следующую цель, чтобы создать исполняемый файл sql и plsql из ant.
И PLSQL в файле файл выглядит примерно так:
что когда ant target makeExecutableSQLs запускает выходные данные —
но это при запуске позже не работает из-за этой ошибки —
Error starting at line : 1 in command — BEGIN FOR c IN —query LOOP dbms_utility.blah Error report — ORA-06550: line 9, column 135: PLS-00103: Encountered the symbol «end-of-file» when expecting one of the following:
Не могу понять, где ошибка?
Ошибки PL / SQL возникают из-за того, что вы заменили разделители операторов PL / SQL точкой с запятой на терминаторы блока.
Когда компилятор видит, / он завершает работу и выполняет команду в буфере, поэтому он видит и пытается скомпилировать и запустить
как автономный полный блок PL / SQL. Как ошибка, которую вы получаете от этого
ORA-06550: line 9, column 135: PLS-00103: Encountered the symbol «end-of-file» .
указывает, что очевидно завершенный блок заканчивается раньше положенного срока. Терминатора оператора после точки с запятой нет blah , но также нет end loop или end для блока — в этом коде он пытается выполнить. По сути, он не видел остальной части сценария.
Затем он продолжает и пытается интерпретировать следующий фрагмент.
что также недействительно; клиент даже не пытается это выполнить, потому что не знает, что с этим делать.
Затем следующий кусок
успешно выполняется как простой оператор SQL (управление транзакциями), а не в контексте PL / SQL.
Короче говоря, вы не можете заменить точку с запятой на косую черту в блоке PL / SQL, поскольку они делают разные вещи. В простом SQL они взаимозаменяемы (или, скорее, для большинства клиентов они взаимозаменяемы; по крайней мере, по умолчанию — даже в SQL * Plus вы можете изменить терминатор SQL с точки с запятой на что-то другое).
Клиент по-прежнему обрабатывает косую черту после блока PL / SQL, и когда он видит, что он отправляет блок в базу данных для выполнения. Но хотя он знает, что находится внутри блока, он знает, что любые точки с запятой, которые он видит, являются частью языка PL / SQL, и не должен пытаться их интерпретировать.
Это упоминается в документации SQL * Plus для выполнения блоков PL / SQL , и другие клиенты, как правило, ведут себя аналогичным образом.
Execute the current subprogram with a RUN or slash ( / ) command. A semicolon ( ; ) is treated as part of the PL/SQL subprogram and will not execute the command.
Источник
никмейн 53 / 37 / 17 Регистрация: 24.10.2016 Сообщений: 960 |
||||
1 |
||||
08.01.2018, 20:54. Показов 1521. Ответов 5 Метки нет (Все метки)
Такой вопрос: я создал триггер, но этот триггер компилируется и выскакивает такая ошибка Trigger SIGNER_ID_BIR compiled. Error starting at line : 288 in command — Что делать? Вот код:
__________________
0 |
Grossmeister Модератор 4192 / 3031 / 577 Регистрация: 21.01.2011 Сообщений: 13,109 |
||||
09.01.2018, 10:35 |
2 |
|||
:NEW.SIGNER_ID:=XMLD_SIGNERS_ID_SEQ.NEXTVAL; Не во всех версиях Oracle такое возможно (вроде только с Ora 12).
0 |
53 / 37 / 17 Регистрация: 24.10.2016 Сообщений: 960 |
|
09.01.2018, 16:46 [ТС] |
3 |
Не во всех версиях Oracle такое возможно (вроде только с Ora 12). у меня Oracle XE
0 |
Модератор 4192 / 3031 / 577 Регистрация: 21.01.2011 Сообщений: 13,109 |
|
09.01.2018, 16:55 |
4 |
Oracle XE Есть версии Oracle 10 XE и Oracle 11 XE. Так что ни разу не 12.
0 |
53 / 37 / 17 Регистрация: 24.10.2016 Сообщений: 960 |
|
09.01.2018, 20:56 [ТС] |
5 |
Oracle 11 XE
0 |
Модератор 4192 / 3031 / 577 Регистрация: 21.01.2011 Сообщений: 13,109 |
|
10.01.2018, 09:50 |
6 |
Oracle 11 XE Ну так я уже показал текст в первом сообщении. PS
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
10.01.2018, 09:50 |
Помогаю со студенческими работами здесь Ошибка в триггере Ошибка в триггере public class CheckPlayer : MonoBehaviour { public RoomManager p; Ошибка в триггере DECLARE Ошибка в триггере Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 6 |
У меня есть следующий запрос, который я использую в Oracle 11g
IF EXISTS (SELECT * FROM EMPLOYEE_MASTER WHERE EMPID='ABCD32643')
THEN
update EMPLOYEE_MASTER set EMPID='A62352',EMPNAME='JOHN DOE',EMPTYPE='1' where EMPID='ABCD32643' ;
ELSE
insert into EMPLOYEE_MASTER(EMPID,EMPNAME,EMPTYPE) values('A62352','JOHN DOE','1') ;
END IF;
Запустив оператор, я получаю следующий вывод:
Error starting at line : 4 in command -
ELSE
Error report -
Unknown Command
1 row inserted.
Error starting at line : 6 in command -
END IF
Error report -
Unknown Command
Значения вставляются с ошибкой, когда я запускаю его напрямую. Но когда я пытаюсь выполнить этот запрос через свое приложение, я получаю исключение оракула из-за сгенерированной ошибки:
ORA-00900: invalid SQL statement
И, следовательно, значения не вставляются.
Я относительно новичок в Oracle. Посоветуйте, пожалуйста, что не так с приведенным выше запросом, чтобы я мог выполнить этот запрос без ошибок.
2 ответа
Лучший ответ
Если MERGE
у вас не работает, попробуйте следующее:
begin
update EMPLOYEE_MASTER set EMPID='A62352',EMPNAME='JOHN DOE',EMPTYPE='1'
where EMPID='ABCD32643' ;
if SQL%ROWCOUNT=0 then
insert into EMPLOYEE_MASTER(EMPID,EMPNAME,EMPTYPE)
values('A62352','JOHN DOE','1') ;
end if;
end;
Здесь вы update
по спецификации, затем проверьте, нашли ли вы подходящую строку, и insert
, если вы этого не сделали.
1
Erich Kitzmueller
29 Мар 2017 в 09:25
«что не так с вышеуказанным запросом»
Что не так с запросом, так это то, что это не запрос (SQL). Это должен быть фрагмент программы (PL / SQL), но он не записан как блок PL / SQL, обрамленный ключевыми словами BEGIN
и END;
.
Но превращение его в анонимный блок PL / SQL не поможет. Oracle PL / SQL не поддерживает синтаксис IF EXISTS (select ...
.
К счастью, Oracle SQL поддерживает оператор MERGE, который делает то же самое, что и ваш код, с меньшим набором текста.
merge into EMPLOYEE_MASTER em
using ( select 'A62352' as empid,
'JOHN DOE' as empname,
'1' as emptype
from dual ) q
on (q.empid = em.empid)
when not matched then
insert (EMPID,EMPNAME,EMPTYPE)
values (q.empid, q.empname, q.emptype)
when matched then
update
set em.empname = q.empname, em.emptype = q.emptype
/
Кроме того, что вы также пытаетесь обновить empid
. Это не поддерживается в MERGE
. Почему вы хотите изменить первичный ключ?
«Нужен ли этот запрос для добавления значений во все столбцы таблицы?»
INSERT
может иметь все столбцы в таблице. UPDATE
не может изменить столбцы, используемые в предложении ON
(обычно это первичный ключ), потому что это ограничение работы MERGE. Я думаю, что это тот же механизм сохранения ключей, который мы видим при обновлении представлений. Подробнее …,
0
APC
29 Мар 2017 в 09:22