Добавление переменной в SQL через JDBC [закрыт]
Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.
Закрыт 6 лет назад .
Подключаюсь к базе c помощью jdbc. Хотел бы создать в SQL запросе переменную, которую потом можно было бы подставлять в основную логику программы на Java. Как это можно реализовать.
Отслеживать
задан 1 авг 2017 в 21:02
95 7 7 бронзовых знаков
Хотел бы создать в SQL запросе переменную, которую потом можно было бы подставлять в основную логику программы на Java. Если Вы имеете в виду, что выполнение SQL-запроса на MySQL-сервере должно создать на клиентской рабочей станции переменную, доступную в Вашей Java-программе — так это невозможно. А если что-то иное — то, вероятно, неплохо бы получше продумать формулировку вопроса.
2 авг 2017 в 5:11
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Вам нужно использовать PreparedStatement . Вот пример из JavaDoc
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE 153833.00) pstmt.setInt(2, 110592)
Отслеживать
ответ дан 1 авг 2017 в 21:20
Mikhail Vaysman Mikhail Vaysman
14.2k 1 1 золотой знак 21 21 серебряный знак 31 31 бронзовый знак
Вот так устанавливайте соединение:
Connection conn = DriverManager.getConnection("url", "username", "password");
И потом записывайте в таблицу ваши данные:
// Вам понадобится сам sql запрос String sql = "INSERT INTO exemple (id, val) VALUES (DEFAULT, (?))" //Создаете PreparedStatement что-бы не забыть закрыть лучше открывать в try-with-resources try (final PreparedStatement statement = //сюда передаете sql запрос: connection.prepareStatement(sql)) < //Тут у вас задаются значения для (?). //Вместо (?) подставляете значение ("test"). Индексация параметров(wildcard) - (?) начинается от 1. statement.setString(1, "test"); //Выполняете сам запрос в базу. statement.executeUpdate(); >catch (SQLException e)
Это сработает если ваша таблица выглядит на пример так:
CREATE TABLE exemple ( id SERIAL, val TEXT, );
Использование базовых типов данных
Драйвер Microsoft JDBC для SQL Server использует базовые типы данных JDBC для преобразования типов данных SQL Server в формат, понятный языком программирования Java, и наоборот. Драйвер JDBC обеспечивает поддержку API JDBC 4.0, в том числе типа данных SQLXML и типов данных Юникода для национальных символов: NCHAR, NVARCHAR, LONGNVARCHAR и NCLOB.
Сопоставление типов данных
В следующей таблице перечислены сопоставления по умолчанию между базовыми типами данных языка SQL Server, JDBC и Java.
1 Для использования java.sql.Time с типом SQL Server необходимо задать для свойства подключения sendTimeAsDatetime значение false.
2 Значения datetimeoffset можно получить программным образом с помощью класса DateTimeOffset.
3 значения java.sql.Timestamp больше не могут использоваться для сравнения значений из столбца datetime начиная с SQL Server 2016. Это ограничение связано с изменением на стороне сервера, которое преобразует datetime в datetime2 иначе, что приводит к не равным значениям. Решение этой проблемы заключается в изменении столбцов даты и времени на datetime2(3), использования String вместо java.sql.Timestamp или изменения уровня совместимости базы данных на 120 или ниже.
В следующих разделах приводятся примеры использования драйвера JDBC и базовых типов данных. Более подробный пример использования базовых типов данных в приложении Java см. в разделе Образец базовых типов данных.
Извлечение данных в виде строки
Если необходимо получить данные из источника данных, который сопоставляется с любым из базовых типов данных JDBC для просмотра в виде строки или если строго типизированные данные не требуются, используйте метод getString класса SQLServerResultSet. В следующем примере показано использование:
try(Statement stmt = con.createStatement();)
Извлечение данных по типу данных
Если вам нужно получить из источника данные известного типа, воспользуйтесь одним из методов get класса SQLServerResultSet, также известных как методы получения. Можно использовать имя столбца или индекс столбца с методами get , как показано в следующем примере:
try(Statement stmt = con.createStatement();)
Применение getUnicodeStream и getBigDecimal в сочетании с методами масштабирования считается устаревшим и не поддерживается драйвером JDBC.
Обновление данных по типу данных
Если вам нужно обновить значение поля в источнике данных, воспользуйтесь одним из методов update класса SQLServerResultSet. В следующем примере метод updateInt используется с методом updateRow для обновления данных в источнике данных:
try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);)
Драйвер JDBC не может обновить столбец SQL Server, если имя столбца длиннее, чем 127 символов. При попытке обновить столбец, имя которого длиннее 127 символов, возникнет исключение.
Обновление по параметризированному запросу
При обновлении данных в источнике данных с помощью параметризованного запроса можно задать тип данных параметров с помощью одного из методов набора класса SQLServerPreparedStatement. Эти методы также называются методами задания. В следующем примере метод prepareStatement используется для предварительной компиляции параметризованного запроса, а затем метод setString используется для задания строкового значения параметра перед вызовом метода executeUpdate.
try(PreparedStatement pstmt = con.prepareStatement("UPDATE employee SET fname = ? WHERE (lname = 'Brown')");)
Дополнительные сведения о параметризованных запросах см. в этой статье.
Передача параметров хранимой процедуре
Если вам нужно передать параметры типа хранимой процедуре, вы можете задать параметры по имени или индексу с помощью методов set класса SQLServerCallableStatement. В следующем примере метод prepareCall используется для вызова хранимой процедуры, затем с помощью метода setString задается параметр для вызова, после чего вызывается метод executeQuery.
try(CallableStatement cstmt = con.prepareCall("");)
В данном примере возвращается результирующий набор с результатами запуска хранимой процедуры.
BigDecimal
При использовании значений параметра BigDecimal передайте точность и масштаб значения вместе со значением setBigDecimal . Это setBigDecimal позволяет избежать усечения потенциального значения. Если значение передается в одиночку, драйвер предполагает максимально допустимое значение (38) для точности для этого значения BigDecimal.
Дополнительные сведения об использовании драйвера JDBC с хранимыми процедурами и входными параметрами см. в этой статье.
Извлечение параметров из хранимой процедуры
Если необходимо получить параметры обратно из хранимой процедуры, необходимо сначала зарегистрировать параметр по имени или индексу с помощью метода registerOutParameter out класса SQLServerCallableStatement. Затем назначьте возвращенный параметр соответствующей переменной после запуска вызова хранимой процедуры. В следующем примере метод prepareCall используется для настройки вызова хранимой процедуры, метод registerOutParameter используется для настройки out параметра, а затем метод setString используется для задания параметра перед вызовом метода ExecuteQuery. Значение out параметра хранимой процедуры извлекается с помощью метода getShort .
try(CallableStatement cstmt = con.prepareCall("");)
В дополнение к возвращаемому параметру OUT также можно вернуть результирующий набор с результатами запуска хранимой процедуры.
Дополнительные сведения об использовании драйвера JDBC с хранимыми процедурами и выходными параметрами см. в этой статье.
Как в sql запрос вставить переменную java
Через переменные мы можем передавать данные в запросы. И также мы можем получать данные, которые являются результатом запросов, в переменные. Например, при выборке из таблиц с помощью команды SELECT мы можем извлекать данные в переменную с помощью следующего синтаксиса:
SELECT @переменная_1 = спецификация_столбца_1, @переменная_2 = спецификация_столбца_2, . @переменная_N = спецификация_столбца_N
Кроме того, в выражении SET значение, присваиваемое переменной, также может быть результатом команды SELECT.
Например, пусть у нас будут следующие таблицы:
CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL ); CREATE TABLE Customers ( Id INT IDENTITY PRIMARY KEY, FirstName NVARCHAR(30) NOT NULL ); CREATE TABLE Orders ( Id INT IDENTITY PRIMARY KEY, ProductId INT NOT NULL REFERENCES Products(Id) ON DELETE CASCADE, CustomerId INT NOT NULL REFERENCES Customers(Id) ON DELETE CASCADE, CreatedAt DATE NOT NULL, ProductCount INT DEFAULT 1, Price MONEY NOT NULL );
Используем переменные при извлечении данных:
DECLARE @maxPrice MONEY, @minPrice MONEY, @dif MONEY, @count INT SET @count = (SELECT SUM(ProductCount) FROM Orders); SELECT @minPrice=MIN(Price), @maxPrice = MAX(Price) FROM Products SET @dif = @maxPrice - @minPrice; PRINT 'Всего продано: ' + STR(@count, 5) + ' товарa(ов)'; PRINT 'Разница между максимальной и минимальной ценой: ' + STR(@dif)
В данном случае переменная @count будет содержать сумму всех значений из столбца ProductCount таблицы Orders, то есть общее количество проданных товаров.
Переменные @min и @max хранят соответственно минимальное и максимальное значения столбца Price из таблицы Products, а переменная @dif — разницу между этими значениями. И подобно простым значениям, переменные также могут участвовать в операциях.
DECLARE @sum MONEY, @id INT, @prodid INT, @name NVARCHAR(20); SET @id=2; SELECT @sum = SUM(Orders.Price*Orders.ProductCount), @name=Products.ProductName, @prodid = Products.Id FROM Orders INNER JOIN Products ON ProductId = Products.Id GROUP BY Products.ProductName, Products.Id HAVING Products.Id=@id PRINT 'Товар ' + @name + ' продан на сумму ' + STR(@sum)
Здесь извлекаемые данные из двух таблиц Products и Orders группируются по столбцам Id и ProductName из таблицы Products. Затем данные фильтруются по столбцу Id из Products. А извлеченные данные попадают в переменные @sum, @name, @prodid.
Вставка переменных в SQL — запрос. Python3
Подскажите плиз, не могу вставить в SQL-запрос значение в двойных кавычках.
Сам запрос выглядит так:
SELECT family,name FROM violations WHERE processing_state = 2 LIMIT AND violations.last_edit BETWEEN "2015-11-01" AND "2015-11-02")
Попытка вставить в проекте Python
vs = "2015-11-01" vs2 = "2015-11-02" sql=("SELECT family,name FROM violations WHERE processing_state = 2 LIMIT AND violations.last_edit BETWEEN %s AND %s") cur.execute(sql,(vs,vs2))
В итоге получаю ошибку вида
\'AND violations.last_edit BETWEEN \'\\"2015-11-01\\"\' AND \'\\"2015-11-02\\"\'\' at line 1'
Уже и в двойный, и в одинарные кавычки пытался заключать переменные vs и vs2, не помогает(
Для коннекта к БД Использую PyMySQL.
