Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите пожалуйста вызвать хранимку спрингом! / 10 сообщений из 10, страница 1 из 1
19.02.2015, 11:43
    #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
19.02.2015, 11:55
    #38883736
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста вызвать хранимку спрингом!
по-моему, в вызове пропущено название оракловского пакета:
Код: java
1.
super(dataSource, "PORTAL.PORTAL_SEARCH.FIND_TEMPLATES_BY_TOKENS");
...
Рейтинг: 0 / 0
19.02.2015, 12:06
    #38883763
Саабразим Аль-каши Бухани
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста вызвать хранимку спрингом!
ivanra,

Я в какой-то момент вытащил ее из пакета и пробовал вызывать так. Не помогло, та же ошибка. В коде забыл вернуть обратно, виноват. Сейчас в коде Ваш вариант, не работает, ошибка та же.
...
Рейтинг: 0 / 0
19.02.2015, 12:17
    #38883783
0FD
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
19.02.2015, 12:54
    #38883857
Саабразим Аль-каши Бухани
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста вызвать хранимку спрингом!
0FDСаабразим Аль-каши Бухани,

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

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

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

И я его вызываю в конструкторе.
...
Рейтинг: 0 / 0
19.02.2015, 14:02
    #38883957
0FD
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
19.02.2015, 14:18
    #38883974
Саабразим Аль-каши Бухани
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста вызвать хранимку спрингом!
0FD,

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

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


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