неверный шаблон имени при попытке передать пользовательское сопоставление объектов типа оракула

Вопрос: Java Spring настраивает тип Oracle как параметр и получает следующую ошибку. Я не понимаю, что это значит по неверному шаблону имени? Любая помощь оценивается. org.springframework.jdbc.UncategorizedSQLException: ### Error updating database. Cause: java.sql.SQLException: invalid name pattern: UPSELL.mkt_list_tab ### The error may involve com.comcast.upsell.dao.ProviderAndRegionalDao.getCorpsToMarketsList-Inline ### The error occurred while setting parameters ### SQL: call upsell_tx_etl_report.GET_OFFER_CORPS_TO_MARKETS( ?, ?,

Вопрос:

Java Spring настраивает тип Oracle как параметр и получает следующую ошибку.

Я не понимаю, что это значит по неверному шаблону имени?

Любая помощь оценивается.

org.springframework.jdbc.UncategorizedSQLException: ### Error updating database. Cause: java.sql.SQLException: invalid name pattern: UPSELL.mkt_list_tab ### The error may involve com.comcast.upsell.dao.ProviderAndRegionalDao.getCorpsToMarketsList-Inline ### The error occurred while setting parameters ### SQL: call upsell_tx_etl_report.GET_OFFER_CORPS_TO_MARKETS( ?, ?, ? ) ### Cause: java.sql.SQLException: invalid name pattern: MY_SCHEMA.mkt_list_tab ; uncategorized SQLException for SQL []; SQL state [99999]; error code [17074]; invalid name pattern: MY_SCHEMA.mkt_list_tab; nested exception is java.sql.SQLException: invalid name pattern: MY_SCHEMA.mkt_list_tab at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:71) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:364) at com.sun.proxy.$Proxy15.update(Unknown Source)

Следующее – это отклонение типа моего оракула

create or replace type mkt_list_tab is table of mkt_list_rec create or replace type mkt_list_rec as object ( market VARCHAR2(100) ) Procedure call as following PROCEDURE GET_OFFER_CORPS_TO_MARKETS(p_division IN VARCHAR2, —ALL/Particular p_market_list IN mkt_list_tab, o_offer_corp_market_cur OUT SYS_REFCURSOR)

Вот мой обработчик типа java

public class MarketListTypeHandler implements TypeHandler { @SuppressWarnings(«unchecked») @Override public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { C3P0NativeJdbcExtractor cp30NativeJdbcExtractor = new C3P0NativeJdbcExtractor(); OracleConnection connection = (OracleConnection) cp30NativeJdbcExtractor.getNativeConnection(ps.getConnection()); List<StoredProcedurePojo> objects = (List<StoredProcedurePojo>) parameter; StructDescriptor structDescriptor = StructDescriptor.createDescriptor(«mkt_list_rec», connection); STRUCT[] structs = new STRUCT[objects.size()]; for (int index = 0; index < objects.size(); index++) { StoredProcedurePojo pack = objects.get(index); Object[] params = new Object[2]; params[0] = pack.getMarket(); STRUCT struct = new STRUCT(structDescriptor, ps.getConnection(), params); structs[index] = struct; } ArrayDescriptor desc = ArrayDescriptor.createDescriptor(«mkt_list_tab», ps.getConnection()); ARRAY oracleArray = new ARRAY(desc, ps.getConnection(), structs); ps.setArray(i, oracleArray); } @Override public Object getResult(ResultSet arg0, String arg1) throws SQLException { // TODO Auto-generated method stub return null; } @Override public Object getResult(ResultSet arg0, int arg1) throws SQLException { // TODO Auto-generated method stub return null; } @Override public Object getResult(CallableStatement arg0, int arg1) throws SQLException { // TODO Auto-generated method stub return null; } public MarketListTypeHandler() { super(); // TODO Auto-generated constructor stub } }

Вот мой класс pojo для хранимой процедуры

public class StoredProcedurePojo { private String market; public String getMarket() { return market; } public void setMarket(String market) { this.market = market; } }

Я пытаюсь выполнить следующее решение

Как передать Java-список объектов в хранимую процедуру Oracle с помощью MyBatis?

Лучший ответ:

Идентификатор пользователя oracle, который вы используете для своего приложения, не имеет доступа к типу MY_SCHEMA.mkt_list_tab.

Также убедитесь, что нижеследующие пункты.

1) В вашем вызове дескриптора должны быть ВСЕ шапки типа MY_SCHEMA.MKT_LIST_TAB.
2) Если вы не используете имя схемы в коде, а ваш идентификатор приложения связан с другой схемой, лучше создать PUBLIC SYNONYM для типа (как родителя, так и дочернего) и предоставить привилегию EXECUTE вашему идентификатору приложения, else, используйте имя схемы в коде. (необходимы еще привилегии)

Ответ №1

Одна из двух вещей:

  • Пользователь oracle, к которому вы подключаетесь к базе данных, не имеет привилегий для выполнения хранимой процедуры (маловероятно)
  • Ваш ArrayDescriptor и StructDescriptor должны иметь “mkt_list_tab” и “mkt_list_rec” соответственно в верхнем регистре. (более вероятно)

Обновление: этот вопрос похож на ваш.

Ответ №2

Я столкнулся с такой же проблемой при вызове процедуры хранения Oracle.

PACKAGE_NAME.PROCEDURE_NAME (?,?,?,?,?,?,?,?,?)}];

13: 52: 24.202 [main] DEBUG osjsSQLStateSQLExceptionTranslator – Извлеченный класс состояний SQL ’99’ из значения ‘99999’ org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; не классифицированный SQLException для SQL [{вызов PACKAGE_NAME.PROCEDURE_NAME (?,?,?,?,?,?,?,?,?)}]; Состояние SQL [99999]; код ошибки [17074]; неверный шаблон имени: SCHEMA.Type_Param; Вложенное исключение – это java.sql.SQLException: неправильный шаблон имени: SCHEMA.Type_Param at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83) в org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator. java: 80) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) в org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1036) на org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1070) в org.springframework.jdbc.object.StoredProcedure.execute(StoredProcedure.java:144)

Моя процедура принимала 1 входной параметр типа таблицы. Этот параметр был определен в области уровня пакета. Поэтому я перемещаю этот параметр уровня пакета на уровень параметра Schema и решал проблему.

Типы PLSQL, созданные в пакете, не могут быть доступны непосредственно из java.

Оцените статью
Добавить комментарий