Вызов хранимой процедуры с табличным параметром из Java
18977 просмотра
5 ответа
В моем приложении я хочу выполнить запрос как SELECT * FROM tbl WHERE col IN (@list) где, @ list может иметь переменную no значений. Я использую базу данных MS SQL Server. Когда я Google эту проблему, то я нашел эту ссылку
http://www.sommarskog.se/arrays-in-sql-2008.html
Эта ссылка говорит об использовании табличного параметра. Поэтому я создал пользовательский тип данных с помощью Microsoft SQL Server Management Studio.
CREATE TYPE integer_list_tbltype AS TABLE (n int NOT NULL ПЕРВИЧНЫЙ КЛЮЧ)
Тогда я написал хранимую процедуру
CREATE PROCEDURE get_product_names @prodids integer_list_tbltype READONLY AS
SELECT p.ProductID, p.ProductName
FROM Northwind.dbo.Products p
WHERE p.ProductID IN (SELECT n FROM @prodids)
а затем с помощью студии управления только я выполнил эту процедуру
DECLARE @mylist integer_list_tbltype
INSERT @mylist(n) VALUES(9),(12),(27),(37)
EXEC get_product_names @mylist
и это дает мне правильный вывод. Но мне интересно, как вызвать эту хранимую процедуру из исходного кода Java. Я знаю, как вызвать простую хранимую процедуру с постоянным номером аргумента
CallableStatement proc_stmt = null;
proc_stmt = con.prepareCall("{call test(?)}");
proc_stmt.setString(1,someValue);
но как вызвать хранимую процедуру в случае параметра табличного значения?
Автор: pranay godha Источник Размещён: 13.11.2019 11:32Ответы (5)
6 плюса
Это задокументировано здесь в руководстве по драйверу JDBC . В вашем случае вам придется сделать это:
try (SQLServerCallableStatement stmt =
(SQLServerCallableStatement) con.prepareCall("{call test(?)}")) {
SQLServerDataTable table = new SQLServerDataTable();
sourceDataTable.addColumnMetadata("n", java.sql.Types.INTEGER);
sourceDataTable.addRow(9);
sourceDataTable.addRow(12);
sourceDataTable.addRow(27);
sourceDataTable.addRow(37);
stmt.setStructured(1, "dbo.integer_list_tbltype", table);
}
Я также недавно зарегистрировал это в статье .
Автор: Lukas Eder Размещён: 01.02.2017 10:454 плюса
Похоже, это запланированное дополнение к JDBC, но оно еще не реализовано:
Передайте параметр в виде строки с разделителями («9,12,27,37»), а затем создайте в SQL Server табличную функцию с именем «fnSplit» или что-то еще, что будет возвращать целочисленные значения в таблице (просто найдите «sql»). функция разделения сервера, "их миллионы).
Автор: Kevin Suchlicki Размещён: 16.04.2013 10:092 плюса
Типичные ответы (с разделителями-запятыми или XML) имеют проблемы с SQL-инъекцией. Мне нужен был ответ, который позволяет мне использовать PreparedStatement. Итак, я придумал это:
StringBuilder query = new StringBuilder();
query.append(
"DECLARE @mylist integer_list_tbltype;" +
"INSERT @mylist(n) VALUES(?)");
for (int i = 0; i < values.size() - 1; ++i) {
query.append(",(?) ");
}
query.append("; EXEC get_product_names @mylist ");
PreparedStatement preparedStmt = conn.prepareStatement(query.toString());
for (int i = 0; i < values.size(); ++i) {
preparedStmt.setObject(i + 1, itemLookupValues.get(i));
}
Автор: Guy Schalnat
Размещён: 09.07.2015 09:50
2 плюса
Теперь он был добавлен в драйвер JDBC 6.0. Это CTP2 пока нет.
«Этот новый драйвер теперь поддерживает табличные параметры и Azure Active Directory. В дополнение к этим новым функциям мы добавили дополнительные функции для Always Encrypted. Драйвер также поддерживает интернационализированные доменные имена и параметры».
https://blogs.msdn.microsoft.com/jdbcteam/2016/04/04/get-the-new-microsoft-jdbc-driver-6-0-preview/
Ссылка для скачивания: https://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11774
Вот документация, как его использовать https://msdn.microsoft.com/en-us/library/mt651781(v=sql.110).aspx
Автор: kazim Размещён: 12.06.2016 12:35-7 плюса
После некоторого поиска я нашел решение этой проблемы. Особенно, когда вы используете предложение IN и ни один из операндов не является переменным, вы можете использовать значения с разделителями-запятыми в качестве входных данных в предложении IN.
Вот пример того, как хранимая процедура, которая будет извлекать всех юристов данного типа юриста в предоставленном почтовом индексе, будет выглядеть с использованием динамического SQL.
CREATE PROCEDURE [dbo].[GetLawyers] ( @ZIP CHAR(5), @LawyerTypeIDs VARCHAR(100) )
AS
DECLARE @SQL VARCHAR(2000)
SET @SQL = 'SELECT * FROM [dbo].[Lawyers]
WHERE [ZIP] = ' + @ZIP + ' AND
[LawyerTypeID] IN (' + @LawyerTypeIDs + ')'
EXECUTE (@SQL)
GO
Чтобы выполнить хранимую процедуру, передавая введенный пользователем почтовый индекс и выбранный юрист, введите значение через запятую:
EXECUTE [dbo].[GetLawyers] '12345', '1,4'
Итак, вывод: вам не нужно использовать TVP. Какой бы язык [Java, PHP] вы ни использовали, просто передавайте параметры в виде строки с разделителями-запятыми в хранимую процедуру, и она будет работать идеально.
Итак, в JAVA вы можете вызвать выше хранимую процедуру:
proc_stmt = con.prepareCall("{call GetLawyers(?,?)}");
proc_stmt.setString(1,"12345");
proc_stmt.setString(2,"'1,4'");
Автор: pranay godha
Размещён: 18.04.2013 02:21
Вопросы из категории :
- sql Проверить наличие изменений в таблице SQL Server?
- sql Обменять уникальные индексированные значения столбцов в базе данных
- sql Как работает индексация базы данных?
- sql Как индексировать столбец базы данных
- sql-server Как разбить строку, чтобы я мог получить доступ к элементу x?
- sql-server Клиент SQL для Mac OS X, который работает с MS SQL Server
- sql-server Удалить все таблицы, имена которых начинаются с определенной строки
- stored-procedures Хранимая процедура T-SQL, которая принимает несколько значений Id
- stored-procedures Как условно создать хранимую процедуру в SQL Server?
- stored-procedures Как быстро определить самые последние измененные хранимые процедуры в SQL Server
- stored-procedures Какой синтаксис T-SQL для подключения к другому серверу SQL?
- jdbc Как избежать хранения паролей в открытом виде для tomcat server.xml Определение ресурса DataSource?
- jdbc Могу ли я подключиться к SQL Server с помощью аутентификации Windows из веб-приложения Java EE?
- jdbc Как я могу получить размер java.sql.ResultSet?
- jdbc Как выполнить модульное тестирование кода JDBC в Java?
- parameters Передать по ссылке или передать по значению?
- parameters Как вы передаете функцию в качестве параметра в C?
- parameters Сколько аргументов конструктора слишком много?
- parameters В чем разница между аргументом и параметром?