#arrays #oracle #stored-procedures #wso2dss #input-parameters
#массивы #Oracle #хранимые процедуры #wso2-data-services-server #входные параметры
Вопрос:
Я разработчик базы данных, и мы используем сервер службы данных WSO2 для создания веб-сервисов на основе вызовов хранимых процедур Oracle. Одна из хранимых процедур принимает массив в качестве входного параметра. К сожалению, DSS не может сопоставить массив с этим входным параметром. Попытался просмотреть документацию WSO2, но этого не произошло. Я попытался поиграть с определением параметра, чтобы сделать его скалярным или массивом, как показано ниже.
Может кто-нибудь, пожалуйста, помочь в том, какие изменения конфигурации необходимо выполнить?
Также не могли бы вы указать, как будет выглядеть URL-адрес для службы RESTful, которая будет принимать массив данных в качестве входных параметров?
Ниже приведен пример кода хранимой процедуры Oracle и соответствующий сценарий настройки WSO2 DSS. Предоставление и разрешение базы данных не являются проблемой.
/* PL/SQL Code Start */
create or replace type str_array as table of varchar2(100) ;
create or replace procedure procarray (
pv_arr IN str_array,
pv_rset OUT sys_refcursor)
AS
BEGIN
open pv_rset for select column_value as str from table(pv_arr);
End;
show errors;
/* PL/SQL Code End */
Конфигурация веб-сервиса выглядит следующим образом
<data name="test_arrayCall">
<config id="CDE_ODS_DIT">
<property name="driverClassName">oracle.jdbc.driver.OracleDriver</property>
<property name="url">jdbc:oracle:thin:@zzzz:1521</property>
<property name="username">xxxxxxx</property>
<property name="password">yyyyyyy</property>
</config>
<query id="callarray" useConfig="CDE_ODS_DIT">
<sql>call xxxxxxx.procarray(?,?);</sql>
<result element="rows" rowName="row">
<element column="STR" name="STR" namespace="STR" xsdType="string"/>
</result>
<param name="pv_arr" paramType="ARRAY" sqlType="STRING"/> <!-- When making a call the service response throws an Oracle Error -->
<!-- Below parameter setting doesn't work and the service fails to get itself registered successfully -->
<!-- <param name="pv_arr" paramType="ARRAY" sqlType="ARRAY" structType="xxxxxxx.STR_ARRAY"/> /> -->
<param name="pv_rset" sqlType="ORACLE_REF_CURSOR" type="OUT"/>
</query>
<operation name="getdata">
<call-query href="callarray">
<with-param name="pv_arr" query-param="pv_arr"/>
</call-query>
</operation>
</data>
Ниже приведен пример запроса и вывода ответа при передаче двух значений в хранимую процедуру
Запрос :
<body>
<p:getdata xmlns:p="http://ws.wso2.org/dataservice">
<!--1 or more occurrences-->
<xs:pv_arr xmlns:xs="http://ws.wso2.org/dataservice">A</xs:pv_arr>
<xs:pv_arr xmlns:xs="http://ws.wso2.org/dataservice">B</xs:pv_arr>
</p:getdata>
</body>
Ответ :
<soapenv:Fault xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:axis2ns14="http://ws.wso2.org/dataservice">
<soapenv:Code>
<soapenv:Value>axis2ns14:DATABASE_ERROR</soapenv:Value>
</soapenv:Code>
<soapenv:Reason>
<soapenv:Text xml:lang="en-US">DS Code: DATABASE_ERROR
Nested Exception:-
javax.xml.stream.XMLStreamException: DS Fault Message: Error in 'SQLQuery.processStoredProcQuery'
DS Code: DATABASE_ERROR
Source Data Service:-
Name: test_arrayCall
Location: test_arrayCall.dbs
Description: N/A
Default Namespace: http://ws.wso2.org/dataservice
Current Request Name: getdata
Current Params: {pv_arr={A,B}}
Nested Exception:-
java.sql.SQLSyntaxErrorException: ORA-00911: invalid character
</soapenv:Text>
</soapenv:Reason>
<soapenv:Detail>
<axis2ns13:DataServiceFault xmlns:axis2ns13="http://ws.wso2.org/dataservice">
<axis2ns13:current_params>{pv_arr={A,B}}</axis2ns13:current_params>
<axis2ns13:current_request_name>getdata</axis2ns13:current_request_name>
<axis2ns13:nested_exception>java.sql.SQLSyntaxErrorException: ORA-00911: invalid character</axis2ns13:nested_exception>
<axis2ns13:source_data_service>
<axis2ns13:location>test_arrayCall.dbs</axis2ns13:location>
<axis2ns13:default_namespace>http://ws.wso2.org/dataservice</axis2ns13:default_namespace>
<axis2ns13:description>N/A</axis2ns13:description>
<axis2ns13:data_service_name>test_arrayCall</axis2ns13:data_service_name>
</axis2ns13:source_data_service>
<axis2ns13:ds_code>DATABASE_ERROR</axis2ns13:ds_code>
</axis2ns13:DataServiceFault>
</soapenv:Detail>
</soapenv:Fault>
Ответ №1:
Отредактируйте sql-запрос как
<query id="callarray" useConfig="CDE_ODS_DIT">
<sql>call xxxxxxx.procarray(?,str_array(?));</sql>
<result element="rows" rowName="row">
<element column="STR" name="STR" namespace="STR" xsdType="string"/>
</result>
<param name="pv_arr" paramType="ARRAY" sqlType="STRING"/> <!-- When making a call the service response throws an Oracle Error -->
<!-- Below parameter setting doesn't work and the service fails to get itself registered successfully -->
<!-- <param name="pv_arr" paramType="ARRAY" sqlType="ARRAY" structType="xxxxxxx.STR_ARRAY"/> /> -->
<param name="pv_rset" sqlType="ORACLE_REF_CURSOR" type="OUT"/>
</query>
Пожалуйста, обратите внимание, что данные массива должны быть переданы как тип str_array в запросе, как в примере bove