Пользовательские функции не могут быть созданы в самом SQLite. (Тем не менее, любой язык сценариев делает это легко.)

етствующая документация

Я пытаюсь создать триггер, который ловит вставки в таблицу Viewings, где внешний ключ (viewings.location) не соответствует существующему первичному ключу в таблице Places (place.location). Логика, насколько я могу судить, работает как положено. Однако моя проблема связана с попыткой объединить указанное значение в сообщение об ошибке в функции повышения. Это не разрешено?

create trigger catchForeignKeyError BEFORE INSERT ON VIEWINGS
BEGIN
SELECT CASE 
WHEN NEW.location NOT IN (SELECT PLACES.location FROM PLACES) THEN 
RAISE(ABORT, 'Error: Insert into the VIEWINGS table references location '''||NEW.location||''' that is not found in the PLACES table.') 
END; 
END;
 Joe01 дек. 2017 г., 19:19
@Mureinik Ошибка: рядом с "||": синтаксическая ошибка
 Yunnosch01 дек. 2017 г., 22:25
Что это такое'''?
 CL.01 дек. 2017 г., 22:25
@Yunnosch Одна экранированная кавычка и кавычка для конца строки.
 Mureinik01 дек. 2017 г., 19:12
Какую ошибку вы получаете?

Ответы на вопрос(1)

Решение Вопроса

а имя:

RAISE(ABORT, some_error)

Идентификаторы могут быть заключены в двойные кавычки, а по историческим причинам SQLiteпринимает строку (с одинарными кавычками), где ожидается идентификатор, но тогда это должна быть одна строка, а не строковое выражение, состоящее из других значений:

RAISE(ABORT, "some error")

Нет механизма для получения динамического значения в сообщении об ошибке, кроме как путем создания пользовательской функции для этого.

 CL.02 дек. 2017 г., 10:17
Пользовательские функции не могут быть созданы в самом SQLite. (Тем не менее, любой язык сценариев делает это легко.)

Ваш ответ на вопрос