Мне трудно выполнить хранимую процедуру MS SQL Server из Java/jsp. Я хочу вернуть таблицу данных; последняя строка хранимой процедуры - это регулярный оператор select из таблицы.
(С этого момента выполнение хранимой процедуры является cinch в PHP
.)
Я просмотрел эти сайты за помощью:
www.2netave.com
qaru.site/info/234151/...
Я не знал, что есть функция только для хранимых процедур, поскольку вместо этого я использовал createStatement()
.
Теперь, пожалуйста, поймите, что хранимая процедура отлично работает в SQL Server Management Studio, и у меня не было проблем с выполнением специальных запросов в jsp/java с помощью createStatement()
.
Я создал простую хранимую процедуру, которая не принимает никаких аргументов, просто чтобы сузить проблему:
CREATE PROCEDURE sp_test AS
BEGIN
PRINT 'HELLO WORLD'
END
Вот код на моей странице jsp:
Class.forName("net.sourceforge.jtds.jdbc.Driver");
java.sql.Connection conn = java.sql.DriverManager.getConnection("jdbc:jtds:sqlserver://MySQLServer:1433/test", "user", "pass");
java.sql.CallableStatement cs = conn.prepareCall("{call sp_test}");
java.sql.ResultSet ResultSet = cs.execute();
Браузер сообщает мне, что страница не может быть отображена, поскольку произошла ошибка межсетевого сервера. Я знаю, это означает, что есть проблема с приведенным выше кодом.
Я пробовал это:
java.sql.ResultSet ResultSet = cs.executeQuery();
И это:
java.sql.CallableStatement cs = conn.prepareCall("{execute sp_test}");
И это:
java.sql.CallableStatement cs = conn.prepareCall("{exec sp_test}");
И ничего не получилось. Как только я получу эту работу, я могу запустить фактическую хранимую процедуру, которая возвращает данные таблицы из оператора select. Но я даже не могу заставить эту фиктивную хранимую процедуру работать.
Что я здесь делаю неправильно?
Спасибо.
Обновление:
Проверено журналы сервера (IIS) и мой HTTP-прокси, скрипт, и он ничего не сообщает. Тем не менее, IIS использует tomcat в качестве механизма сервлета для jsp-страниц. И файл журнала tomcat сообщил следующее:
An error occurred at line: 20 in the jsp file: /test.jsp
Type mismatch: cannot convert from boolean to ResultSet
17:
18: java.sql.CallableStatement cs = conn.prepareCall("{call sp_test}");
19:
20: java.sql.ResultSet ResultSet = cs.execute();
21:
22: // java.sql.ResultSet ResultSet = state.executeQuery(SQL);
23:
Я попробовал изменить выше:
cs.execute();
И сообщается о файлах журналов:
- Servlet.service() for servlet jsp threw exception
java.sql.SQLException: The EXECUTE permission was denied on the object 'sp_test', database 'test', schema 'dbo'.
Итак, я понял, что я должен GRANT EXECUTE
для пользователя. Другая проблема - возврат табличных данных из хранимой процедуры.
Если у меня есть такая процедура:
CREATE PROCEDURE sp_test2 AS
BEGIN
SELECT * FROM TABLE
END
Как мне манипулировать данными таблицы в jsp? Будет ли работать ResultSet
или только для специальных запросов, в отличие от хранимых процедур, где можно использовать createStatement()
для выполнения запроса?
Спасибо.
Обновление2:
Решение:
Чтобы управлять табличными данными, мне пришлось использовать это:
java.sql.ResultSet RS = cs.executeQuery();
Не удалось выполнить execute()
и не удалось присвоить имя объекту ResultSet
"ResultSet". В прошлом он никогда не жаловался на createStatement()
. Но по какой-то причине, с хранимыми процедурами, ему не понравилось это соглашение об именах.
Спасибо.