powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите пожалуйста вызвать хранимку спрингом!
10 сообщений из 10, страница 1 из 1
Помогите пожалуйста вызвать хранимку спрингом!
    #38883718
Саабразим Аль-каши Бухани
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть хранимка:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
 CREATE OR REPLACE PACKAGE BODY PORTAL.PORTAL_SEARCH AS

  FUNCTION FIND_TEMPLATES_BY_TOKENS(
      dep IN varchar2,
      Param1 IN varchar2,
      Param2 IN varchar2 DEFAULT '',
      Param3 IN varchar2 DEFAULT '',
      Param4 IN varchar2 DEFAULT '',
      Param5 IN varchar2 DEFAULT '',
      Param6 IN varchar2 DEFAULT '',
      Param7 IN varchar2 DEFAULT '',
      Param8 IN varchar2 DEFAULT '',
      Param9 IN varchar2 DEFAULT '',
      Param10 IN varchar2 DEFAULT ''
  ) RETURN SYS_REFCURSOR
  AS
    result  SYS_REFCURSOR;
  BEGIN
    OPEN result FOR 
        select w.template_id as TEMPL_ID, sum(w.weight) as sum, t.NAME as TEMPL_NAME, t.FULL_NAME as FULL_NAME 
        from PORTAL.S_TOKENS_WEIGHT_SHADOW w, SMPRIMARY.TREE t 
        where t.DEPT = dep
        and w.token in (Param1,Param2,Param3,Param4,Param5,Param6,Param7,Param8,Param9,Param10) 
        and t.TEMPLATE_ID=W.TEMPLATE_ID 
        group by w.template_id, t.NAME, t.FULL_NAME
        order by sum desc;
     RETURN result;
  END;

END PORTAL_SEARCH;
/



есть классец:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class FindTemplatesByTokensStoredProc extends StoredProcedure {

	public FindTemplatesByTokensStoredProc(DataSource dataSource) {
         super(dataSource, "PORTAL.FIND_TEMPLATES_BY_TOKENS");
         declareParameter(new SqlReturnResultSet("result", Template.MAPPER));
         declareParameter(new SqlParameter("DEP", Types.VARCHAR));
         setFunction(true);
         for (int i = 1; i <= 10; i++)
        	 declareParameter(new SqlParameter("Param" + i, Types.VARCHAR));
         compile();
     }

     public Map<String, Object> execute(String dep, String...tokens) {
         Map<String, String> inputs = new HashMap<>();
         int varParamCount = tokens.length > 10 ? 10 : tokens.length;
         inputs.put("DEP", dep);
         for (int i = 0; i < 10; i++)
        	 inputs.put("Param" + (i+1), i < varParamCount ? tokens[i] : "-");
         return execute(inputs);
     }

 }



который вызываю так:

String dep = "Департамент 1";
String tokens = {"параметр 1", "параметр 2", "параметр 3", "параметр 4", "параметр 5"};
FindTemplatesByTokensStoredProc proc = new FindTemplatesByTokensStoredProc(
jdbcTempl.getDataSource());
Map results = proc.execute(dep, tokens);

И получаю

Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{? = call PORTAL.PORTAL_SEARCH.FIND_TEMPLATES_BY_TOKENS(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}]; nested exception is java.sql.SQLException: ORA-06550: Строка 1, столбец 13:
PLS-00382: выражение неправильного типа
ORA-06550: Строка 1, столбец 7:
PL/SQL: Statement ignored

at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1137)
at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1173)
at org.springframework.jdbc.object.StoredProcedure.execute(StoredProcedure.java:142)
at ru.sbrf.searcher.db.sp.FindTemplatesByTokensStoredProc.execute(FindTemplatesByTokensStoredProc.java:33)
at ru.sbrf.searcher.db.DataProvider.queryTemplates(DataProvider.java:48)
at ru.sbrf.searcher.app.SearchTempl.main(SearchTempl.java:19)
Caused by: java.sql.SQLException: ORA-06550: Строка 1, столбец 13:
PLS-00382: выражение неправильного типа
ORA-06550: Строка 1, столбец 7:
PL/SQL: Statement ignored

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1059)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:220)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:48)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:938)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1150)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4798)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:4901)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:5631)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1385)
at org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1176)
at org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1173)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1121)
... 5 more


В чем ошибка?
...
Рейтинг: 0 / 0
Помогите пожалуйста вызвать хранимку спрингом!
    #38883736
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по-моему, в вызове пропущено название оракловского пакета:
Код: java
1.
super(dataSource, "PORTAL.PORTAL_SEARCH.FIND_TEMPLATES_BY_TOKENS");
...
Рейтинг: 0 / 0
Помогите пожалуйста вызвать хранимку спрингом!
    #38883763
Саабразим Аль-каши Бухани
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,

Я в какой-то момент вытащил ее из пакета и пробовал вызывать так. Не помогло, та же ошибка. В коде забыл вернуть обратно, виноват. Сейчас в коде Ваш вариант, не работает, ошибка та же.
...
Рейтинг: 0 / 0
Помогите пожалуйста вызвать хранимку спрингом!
    #38883783
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саабразим Аль-каши Бухани,

{? = call PORTAL.PORTAL_SEARCH.FIND_TEMPLATES_BY_TOKENS(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)} ->10 IN параметров
А Вы задаете 11
declareParameter(new SqlParameter("DEP", Types.VARCHAR)); ->1
for (int i = 1; i <= 10; i++) -> +10
declareParameter(new SqlParameter("Param" + i, Types.VARCHAR));
надо i < 10 или что у Вас с версиями процедуры не то, на сервере 10, а Вы привели с 11.
...
Рейтинг: 0 / 0
Помогите пожалуйста вызвать хранимку спрингом!
    #38883857
Саабразим Аль-каши Бухани
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FDСаабразим Аль-каши Бухани,

{? = call PORTAL.PORTAL_SEARCH.FIND_TEMPLATES_BY_TOKENS(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)} ->10 IN параметров
А Вы задаете 11

Дык 11 и надо, 10 вида ParamX и 1 Dep. Не понимаю, почему генерится с 10 параметрами?
И в дебагере видно, что создается 11.
...
Рейтинг: 0 / 0
Помогите пожалуйста вызвать хранимку спрингом!
    #38883890
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саабразим Аль-каши Бухани,

в StoredProcedure есть public void setFunction(boolean function).
...
Рейтинг: 0 / 0
Помогите пожалуйста вызвать хранимку спрингом!
    #38883908
Саабразим Аль-каши Бухани
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FD,

И я его вызываю в конструкторе.
...
Рейтинг: 0 / 0
Помогите пожалуйста вызвать хранимку спрингом!
    #38883957
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саабразим Аль-каши Бухани,

Вижу.
Я не знаю какая у вас верси, но тут https://github.com/spring-projects/spring-framework/blob/master/spring-jdbc/src/main/java/org/springframework/jdbc/object/SqlCall.java в protected final void compileInternal() баг и первый ? не попадает.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
...
if (isFunction()) {
  this.callString = "{? = call " + getSql() + "(";
  parameterCount = -1;
}
...
for (SqlParameter parameter : parameters) {
  if (!(parameter.isResultsParameter())) {
    if (parameterCount > 0) {
       this.callString += ", ";
   }
   if (parameterCount >= 0) {
      this.callString += "?";
   }
   parameterCount++;
 }
}
this.callString += ")}";
...
...
Рейтинг: 0 / 0
Помогите пожалуйста вызвать хранимку спрингом!
    #38883974
Саабразим Аль-каши Бухани
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FD,

Вот так работает. Хотя оба параметра в isResultsParameter() возвращают false...
declareParameter(new SqlOutParameter ("RETURN_VALUE", OracleTypes.CURSOR, MAPPER));
Ну да ладно.
Спасибо за помощь.
...
Рейтинг: 0 / 0
Помогите пожалуйста вызвать хранимку спрингом!
    #38884007
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саабразим Аль-каши Бухани,

Значит не баг, я никогда не использовал spring.jdbc, судя по всему вы не так используете SqlReturnResultSet, который :
Represents a returned {@link java.sql.ResultSet} from a stored procedure call .
и если использовать SqlOutParameter, тогда нормально работает.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите пожалуйста вызвать хранимку спрингом!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]