Подведите итог проблемы === У меня есть хранимая процедура "G_M_D", определенная в схеме "Тест".Он имеет несколько выходных параметров, включая массив (для которого объект "obj_G_M_D" и таблица "tab_G_M_D" создаются в одной и той же схеме "Тест").Нам был предоставлен доступ к базе данных с другой схемой «Dev».«Dev» имеет разрешение «EXECUTE» для «G_M_D», а также для объекта и таблицы.
Когда мы вызываем хранимую процедуру из нашего java-приложения, используя «Dev» в качестве идентификатора пользователя, мы получаем ошибку sql «java.sql.SQLException: недопустимый шаблон имени: Dev.tab_G_M_D»
Предоставьте справочную информацию и расскажите нам, что вы уже пробовали === Если мы используем «Тест» в качестве идентификатора пользователя для подключения к БД, мы можем успешно запустить хранимую процедуру из приложения.Также, если объект и таблица созданы с использованием схемы «Dev» и используются в хранимой процедуре, то, если подключиться к базе данных с помощью «Dev» и выполнить наше приложение, оно будет успешно выполнено.
Проблема в том, что мы делаемУ меня нет прав на использование любого из двух вышеуказанных решений в рабочей среде.
Покажите ваш код === Ниже приведена хранимая процедура (я удалил большую часть блока и поместил фиктивный вывод для более быстрого выполнения. Определениехранимая процедура не изменена)
`create or replace PROCEDURE G_M_D(
in_REQUEST_ID IN OUT VARCHAR2 ,
out_MG_STATUS OUT VARCHAR2 ,
out_M_A OUT tab_G_M_D, -- OPTION_1
out_return_code OUT NUMBER ,
out_return_message OUT VARCHAR2 )
IS
return_code NUMBER := 0;
return_message VARCHAR2(500) := 'executed Successfully';
L_RECORD NUMBER := 0;
Mg_rec tab_G_M_D := tab_G_M_D();
BEGIN
L_RECORD := 0;
l_record := l_record + 1;
out_MG_STATUS :='M';
Mg_rec(l_record).out_M_PHASE := 'M';
Mg_rec(l_record).out_M_TASK := 'Y';
Mg_rec(l_record).out_M_TASK_STATUS := 'Y' ;
Mg_rec(l_record).out_RESPONSE_CODE := 1004;
Mg_rec(l_record).out_STATUS_REASON := 'Y';
Mg_rec(l_record).out_NOTES := 'Y' ;
Mg_rec(l_record).out_STATUS_TIMESTAMP := to_char(SYSDATE) ;
Mg_rec(l_record).out_S_S := 'Y';
out_return_code := return_code;
out_return_message := return_message;
in_request_id := in_request_id;
END G_M_D ;
create or replace Type obj_G_M_D AS OBJECT
(
out_M_PHASE VARCHAR2(150),
out_M_TASK VARCHAR2(150),
out_M_TASK_STATUS VARCHAR2(150),
out_STATUS_REASON VARCHAR2(150),
out_RESPONSE_CODE VARCHAR2(150),
out_NOTES VARCHAR2(1500),
out_STATUS_TIMESTAMP TIMESTAMP,
out_SOURCE_SYSTEM VARCHAR2(150)
);
create or replace TYPE tab_G_M_D AS TABLE OF obj_G_M_D;
the java application is simplified to below code :
public static void main(String args[]) {
try {
Class.forName("oracle.jdbc.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:xxx:yyyy/zzzz", "Dev",
"junkpasssword");
final StringBuilder sql = new StringBuilder("{call Test.G_M_D");
sql.append("(?,?,?,?,?)}");
CallableStatement statement = null;
statement = con.prepareCall(sql.toString());
statement.setQueryTimeout(15000);
statement.registerOutParameter(1, Types.VARCHAR);
statement.setString(1, "request001");
statement.registerOutParameter(2, Types.VARCHAR);
statement.registerOutParameter(3, Types.ARRAY, "tab_M_G_D");
statement.registerOutParameter(4, Types.INTEGER);
statement.registerOutParameter(5, Types.VARCHAR);
statement.executeQuery();
buildFinalResponse(statement);
System.out.println("successfully executed");
con.close();
} catch (Exception e) {
System.out.println(e);
}
}