Как выполнить хранимую процедуру (без объекта массива), определенной в другой схеме, чем схема, к которой у меня есть доступ - PullRequest
0 голосов
/ 27 декабря 2018

Подведите итог проблемы === У меня есть хранимая процедура "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);
    }

}
...