Mulesoft 4.0 передает параметр UDT в хранимую процедуру

#oracle #anypoint-studio #mulesoft

#Oracle #anypoint-studio #mulesoft

Вопрос:

Все,

Мне нужно перейти к хранимой процедуре в Mulesoft. Определение хранимой процедуры Oracle выглядит следующим образом:

   procedure update_snapsheet_task(P_ASSIGNMENT_ID     IN number,
                              P_ASSIGNMENT_STATUS IN varchar2 default null,
                              P_REFERRAL_ID       IN number,
                              P_DOCUMENT_ARRAY    IN p_document_arr,
                              P_USER_ID           IN varchar2,
                              P_ERROR_STATUS      OUT varchar2);
  

где p_document_arr — параметр UDT, который необходимо передать в Mulesoft

p_document_arr определяется в oracle как:

 Type p_documentid_arr IS RECORD(
   document_key   VARCHAR2(4000),
   document_id    NUMBER(10),
   DOWNLOAD_COUNT NUMBER default 0);
Type p_document_arr is table of p_documentid_arr index by binary_integer;
  

Как мне передать что-либо в P_DOCUMENT_ARRAY в Mulesoft 4.0?

Я попробовал эту ссылку: https://help.mulesoft.com/s/article/How-to-pass-an-array-of-objects-to-a-stored-procedure-in-mule-4

В принципе, ссылка предлагает использовать

 %dw 2.0
output application/java
fun documentContents(documentRecord) = (
    Db::createStruct("Database_Config", "P_DOCUMENTID_ARR", [
                    documentRecord.document_key,
                    documentRecord.document_id,
                    documentRecord.download_count ])
)
fun documentContentTab(documentArray) = (
    documentArray map ((item, index) ->
        documentContents(item)
    )
)
---   
{
    "p_assignment_id": vars.inputPayload.assignment_id,
    "p_assignment_status": vars.inputPayload.assignment_status,
    "p_referral_id": vars.inputPayload.referral_id,
    "p_document_array": Db::createArray("Database_Config",
        "P_DOCUMENT_ARR",
        documentContentTab(vars.inputPayload.documents default [])),
    "p_user_id": vars.inputPayload.user_id
}
  

Для вызова хранимой процедуры:

 SQL Query : { CALL cpm.cpm_notification_services.update_snapsheet_task(:p_assignment_id, :p_assignment_status, :p_referral_id, :p_document_array, :p_user_id, :p_error_type) }
  

Кроме того, в глобальной конфигурации я помещаю:

     <db:config name="Database_Config" doc:name="Database Config"
    doc:id="22ad9e72-3df1-4d21-bf8a-407d0c97e491">
    <db:data-source-connection dataSourceRef="oraclePoolDataSource" >
        <db:column-types >
            <db:column-type id="-10" typeName="CURSOR" className="oracle.jdbc.OracleTypes" />
            <db:column-type id="2003" typeName="P_DOCUMENT_ARR" />
            <db:column-type id="2002" typeName="P_DOCUMENTID_ARR" />
        </db:column-types>
    </db:data-source-connection>
</db:config>
  

Но это не сработало. Mulesoft выдает ошибку:

 {
  "status": "Server Error",
  "message": ""Exception while executing createStruct("Database_Config","P_DOCUMENTID_ARR",["abcdes123", 1, 0]) cause: An error occurred when trying to create JDBC Structure. Fail to construct descriptor: Unable to resolve type "P_DOCUMENTID_ARR" nTrace:n  at callFunction (Unknown)n  at createStruct (line: -1, column: -1)n  at documentContents (line: 4, column: 1)n  at main (line: 11, column: 1), while writing Java.nTrace:n  at callFunction (Unknown)n  at createArray (line: -1, column: -1)n  at main (line: 19, column: 21)" evaluating expression:...
...
  

Или из журналов консоли:

 Message               : "Exception while executing 

createStruct("Database_Config","P_DOCUMENTID_ARR",["abcdes123", 1, 0]) cause: An error occurred when trying to create JDBC Structure. Fail to construct descriptor: Unable to resolve type "P_DOCUMENTID_ARR" 
Trace:
  at callFunction (Unknown)
  at createStruct (line: -1, column: -1)
  at documentContents (line: 4, column: 1)
  at main (line: 11, column: 1), while writing Java.
Trace:
  at callFunction (Unknown)
  at createArray (line: -1, column: -1)
  at main (line: 19, column: 21)" evaluating expression: "%dw 2.0
output application/java
fun documentContents(documentRecord) = (
Db::createStruct("Database_Config", "P_DOCUMENTID_ARR", [
    documentRecord.document_key,
        documentRecord.document_id,
        documentRecord.download_count ])
)
fun documentContentTab(documentArray) = (
documentArray map ((item, index) ->
documentContents(item)
)
)
---
{
"p_assignment_id": vars.inputPayload.assignment_id,
"p_assignment_status": vars.inputPayload.assignment_status,
"p_referral_id": vars.inputPayload.referral_id,
"p_document_array": Db::createArray("Database_Config", 
"P_DOCUMENT_ARR",
documentContentTab(vars.inputPayload.documents default [])),
"p_user_id": vars.inputPayload.user_id
}".
  

Пожалуйста, помогите.

Комментарии:

1. Это не сработало, не очень полезно для понимания проблемы. В чем ошибка? Пожалуйста, предоставьте подробности, чтобы было больше шансов, что кто-нибудь сможет вам помочь.

2. обновил вопрос дополнительной информацией. Спасибо

3. Спасибо. Похоже, что эта ошибка была отформатирована каким-то обработчиком ошибок. Есть ли у вас полная необработанная ошибка из журнала?

4. Да, включена ошибка из журнала консоли.

5. Какой драйвер Oracle JDBC и версию использует приложение?