【问题标题】:WSO2 DSS: Issue in Creating Data services using an oracle Stored Procedure with Ref Cursor and other Scalar out parameterWSO2 DSS:使用带有 Ref Cursor 和其他标量输出参数的 oracle 存储过程创建数据服务时出现问题
【发布时间】:2016-05-11 12:10:54
【问题描述】:

我正在学习 WSO2 DSS。我正在尝试使用 DSS 和 Oracle 存储过程来实现我的一个用例。

我使用的Oracle存储过程有一个输入参数和两个标量输出参数,而一个引用游标。

数据库脚本

CREATE TABLE DSS_DEPT
    (
        DEPT_ID   VARCHAR2(10),
        DEPT_NAME VARCHAR2(10)
    );

CREATE TABLE DSS_EMP
    (
        EMP_ID VARCHAR2(10),
        FNAME  VARCHAR2(10),
        LNAME  VARCHAR2(10),
        TITLE  VARCHAR2(10)
    );

CREATE TABLE DSS_EMP_DEPT
    (
        DEPT_ID VARCHAR2(10),
        EMP_ID  VARCHAR2(10)
    );

CREATE OR REPLACE PROCEDURE Get_emp_data(
        p_EMP_ID IN DSS_EMP.EMP_ID%type,
        p_emp_Fname OUT DSS_EMP.FNAME%type,
        p_emp_Lname OUT DSS_EMP.LNAME%type,
        P_DEP_RSET OUT sys_refcursor )
IS
BEGIN

    SELECT FNAME,
        LNAME
    INTO p_emp_Fname ,
        p_emp_Lname
    FROM DSS_EMP
    WHERE EMP_ID = p_EMP_ID;

    OPEN P_DEP_RSET FOR SELECT DEPT_ID FROM DSS_EMP_DEPT WHERE EMP_ID = p_EMP_ID;

END;
/

数据插入脚本

Insert into DSS_DEPT (DEPT_ID,DEPT_NAME) values ('INV','Inventory');
Insert into DSS_DEPT (DEPT_ID,DEPT_NAME) values ('SAL','Sales');


Insert into DSS_EMP (EMP_ID,FNAME,LNAME,TITLE) values ('2','Alpesh','B','SE');
Insert into DSS_EMP (EMP_ID,FNAME,LNAME,TITLE) values ('1','Alps','B','SE');

Insert into DSS_EMP_DEPT (DEPT_ID,EMP_ID) values ('SAL','1');
Insert into DSS_EMP_DEPT (DEPT_ID,EMP_ID) values ('INV','2');
Insert into DSS_EMP_DEPT (DEPT_ID,EMP_ID) values ('SAL','2');
commit;

DSS 配置:

<data name="MyDSSTest" transports="http https local">
   <description>Testing WSO2 DSS with Oracle</description>
   <config enableOData="false" id="DBTEST">
      <property name="carbon_datasource_name">DBTEST</property>
   </config>
   <query id="GetEmpData_qry" useConfig="EDBTEST">
      <sql>call Get_emp_data (:P_EMP_ID ,:P_EMP_FNAME,:P_EMP_LNAME,:P_DEP_RSET)</sql>
      <result element="Employees" rowName="Employee">
         <element name="P_EMP_ID" query-param="P_EMP_ID" xsdType="string"/>
         <element column="P_EMP_FNAME" name="P_EMP_FNAME" xsdType="string"/>
         <element column="P_EMP_LNAME" name="P_EMP_LNAME" xsdType="string"/>
         <element column="DEPT_ID" name="DEPT_ID" xsdType="string"/>
      </result>
      <param name="P_EMP_ID" sqlType="STRING"/>
      <param name="P_EMP_FNAME" sqlType="STRING" type="OUT"/>
      <param name="P_EMP_LNAME" sqlType="STRING" type="OUT"/>
      <param name="P_DEP_RSET" sqlType="ORACLE_REF_CURSOR" type="OUT"/>
   </query>
   <operation name="GetEmpData">
      <call-query href="GetEmpData_qry">
         <with-param name="P_EMP_ID" query-param="P_EMP_ID"/>
      </call-query>
   </operation>
   <resource method="GET" path="GetEmpData/{P_EMP_ID}">
      <call-query href="GetEmpData_qry">
         <with-param name="P_EMP_ID" query-param="P_EMP_ID"/>
      </call-query>
   </resource>
</data>

REST 调用结果

<Employees>
  <Employee>
    <P_EMP_ID>2</P_EMP_ID>
    <P_EMP_FNAME>Alpesh2</P_EMP_FNAME>
    <P_EMP_LNAME>Bhalodia2</P_EMP_LNAME>
    <DEPT_ID>INV</DEPT_ID>
  </Employee>
  <Employee>
    <P_EMP_ID>2</P_EMP_ID>
    <P_EMP_FNAME>Alpesh2</P_EMP_FNAME>
    <P_EMP_LNAME>Bhalodia2</P_EMP_LNAME>
    <DEPT_ID>SAL</DEPT_ID>
  </Employee>
</Employees>

我想要的结果格式

<Employees>
  <Employee>
    <P_EMP_ID>2</P_EMP_ID>
    <P_EMP_FNAME>Alpesh2</P_EMP_FNAME>
    <P_EMP_LNAME>Bhalodia2</P_EMP_LNAME>
    <DEPTS>
      <DEPT_ID>INV</DEPT_ID>
      <DEPT_ID>SAL</DEPT_ID>
    </DEPTS>
  </Employee>
</Employees>

我希望将光标中的部门值导出为复杂元素,如上所示。我在 DSS 中设置输出映射时尝试了所有不同类型的组合,但没有任何效果。

我知道这可以通过在结果之上使用 XSLT 来实现,但我不想这样做。

我在设置输出映射时做错了吗? 如何将光标结果导出为 DSS 中的数组?

【问题讨论】:

    标签: oracle procedure wso2dss ref-cursor dss


    【解决方案1】:

    这是预期的行为。对于其中的每个 DEPT_ID,结果集中都会有一个 Employee 行。

    【讨论】:

    • 根据我上面提供的数据,对于 EMP_ID=2,将有两个 DEPT_ID。我不想重复 EMP_ID 和 Name 两次。从 Oracle 过程中,EMP_ID 和名称也将只返回一次,因为它是标量参数,而 DEPT_ID 是 ref 游标的一部分,因此它可以有一行或多行。
    猜你喜欢
    • 1970-01-01
    • 2012-01-23
    • 2020-09-27
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    相关资源
    最近更新 更多