Как использовать квадратную Scl-интерполяцию Scala с именами-префиксами владельца / схемы
У нас есть настройка базы данных, где у нас есть отдельный пользователь для владельцев и пользователей таблиц базы данных в базе данных Oracle. Это означает, что на практике каждый запрос имеет префикс следующим образом: ownername.tablename
Это прекрасно работает, если я просто напишу все это статически в функции Slick SQLInterpolation.sql:
(sql"select foo_owner.foo_sequence.nextval from dual").as[Long].first()
Проблема в том, что префикс владельца меняется в зависимости от теста / продукта. среда. Что я хотел бы сделать, это:
(sql"select $owner.foo_sequence.nextval from dual").as[Long].first()
Но SQL-интерполяция не работает с этим. Я получаю эту ошибку Oracle:
An exception or error caused a run to abort: ORA-22806: not an object or REF
Какие-либо предложения? Конечно, я могу вернуться к более подробному StaticQuery, но использование интерполяции sql/sqlu было бы гораздо более компактным.
2 ответа
С помощью $foo
вставляет foo как переменную связывания. Вы должны префикс это с #
вставить литерал:
(sql"select #$owner.foo_sequence.nextval from dual").as[Long].first()
Допустимо ли удаление префикса? В вашем коде вы можете запустить
ALTER SESSION SET CURRENT_SCHEMA=yourOwner
Таким образом, вам не нужно префикс SQL. Просто убедитесь, что у вас нет CREATE TABLE или любого другого DML, поскольку он попытается запустить его по схеме владельца.