WSO2数据服务服务器sql update的可选输入参数

时间:2014-10-17 04:54:46

标签: parameters wso2 optional

我有一个sql执行"编辑"操作。如果存在值,编辑的功能应该更新,如果不存在则忽略,因此需要可选的输入参数。要使此功能正常工作,我需要让Data Services Server生成一个带有0次或更多次出现的参数的wsdl / xsd,但似乎我只能生成一个请求,要求在所有输入上出现一次或多次参数。这意味着编辑操作将需要每个字段,而不是仅发送将要更新的那些字段。

此前post!建议在param元素上使用defaultValue作为生成可选输入参数的方法。

下面的代码段显示了wdb2数据服务服务器附带的rdbms_sample中的一些代码。此代码段包含工资输入的defaultValue = 1500。基于上面的帖子和defaultValues的wso2文档!它应该导致为salary字段生成可选的输入参数。



   <query id="addEmployeeQuery" useConfig="default">
      <sql>insert into Employees (employeeNumber, lastName, firstName, email, salary) values(:employeeNumber,:lastName,:firstName,:email,:salary)</sql>
      <param name="employeeNumber" ordinal="1" paramType="SCALAR" sqlType="INTEGER" type="IN"/>
      <param name="lastName" ordinal="2" paramType="SCALAR" sqlType="STRING" type="IN">
         <validateLength maximum="20" minimum="3"/>
      </param>
      <param name="firstName" ordinal="3" paramType="SCALAR" sqlType="STRING" type="IN"/>
      <param name="email" ordinal="4" paramType="SCALAR" sqlType="STRING" type="IN">
         <validatePattern pattern="(?:[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+)*|&quot;(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*&quot;)@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])"/>
      </param>
      <param defaultValue="1500" name="salary" ordinal="5" paramType="SCALAR" sqlType="DOUBLE" type="IN"/>
   </query>
&#13;
&#13;
&#13;

在观察下面的代码片段时,请注意工资预计恰好一次出现而不是0或1次出现,因为文档似乎表明存在默认值。

&#13;
&#13;
<body>
   <p:addEmployee xmlns:p="http://ws.wso2.org/dataservice/samples/rdbms_sample">
      <!--Exactly 1 occurrence-->
      <xs:employeeNumber xmlns:xs="http://ws.wso2.org/dataservice/samples/rdbms_sample">?</xs:employeeNumber>
      <!--Exactly 1 occurrence-->
      <xs:lastName xmlns:xs="http://ws.wso2.org/dataservice/samples/rdbms_sample">?</xs:lastName>
      <!--Exactly 1 occurrence-->
      <xs:firstName xmlns:xs="http://ws.wso2.org/dataservice/samples/rdbms_sample">?</xs:firstName>
      <!--Exactly 1 occurrence-->
      <xs:email xmlns:xs="http://ws.wso2.org/dataservice/samples/rdbms_sample">?</xs:email>
      <!--Exactly 1 occurrence-->
      <xs:salary xmlns:xs="http://ws.wso2.org/dataservice/samples/rdbms_sample">?</xs:salary>
   </p:addEmployee>
</body>
&#13;
&#13;
&#13;

在添加/更新案例中,我需要做什么才能使所有上述参数成为可选项。

2 个答案:

答案 0 :(得分:2)

这是一个非常复杂的问题,需要关注很多变量。首先应该理解,默认情况下,数据库模式应该:

  1. 规定是否允许列包含NULL值,
  2. 如果未指定初始值,则应为列分配什么默认值。
  3. 根据数据库模式,我将这两个称为“Nullable”特性,另一个称为列的“默认值”特征。大多数现代数据库引擎提供这些特征的定义,并允许存在两者的任何组合。 (对这两个特征的最终组合的进一步讨论超出了我们手头问题的范围。)

    接下来,WSO2 DSS中使用的数据服务资源语言(DSRL)是XML的衍生产品。 DSRL用于定义服务的查询和操作。定义服务定义的查询部分时,可以为参数元素分配文字默认值或内部属性值。文字默认值的一个示例是defaultValue =“1500”。定义的内部属性值包括:#{USERNAME},#{NULL},#{TENANT_ID}和#{USER_ROLES}。有关详细信息,请参阅此URL:      https://docs.wso2.com/display/DSS311/Adding+Input+Mappings

    对于添加和更新查询,您需要为要为操作调用选择的任何参数分配defaultValue =#{NULL}。请注意,对于添加,您需要

    1. 为查询定义或
    2. 中未分配defaultValue的元素提供值
    3. 确保在数据库架构中指定了默认值,或者最后
    4. 根据数据库架构,该列为Nullable
    5. 正如您所指出的,似乎参数元素必须全部出现在请求中,但这不一定是真的。您之前提到的帖子最后指出“您可以在没有'employeeNumber'的情况下调用'getEmployees'并获得所有员工”。含义:您根本不必在操作请求中包含该元素,即使在创建数据服务期间插入的文档“恰好1次出现”也会让您相信这一点。

      对于INSERT(添加操作)和UPDATE(编辑操作),如果在查询定义中添加#{NULL}的defaultValue,实际上它确实使参数元素成为一个范围可选。可选,在NOT HAVING的上下文中,在操作调用中完全提供元素。但是,如果您在SQL UPDATE语句中没有执行某些操作来处理其中一个可选参数中包含的NULL值,则仍会在数据库上引发SQL错误。

      在编辑操作中,最理想的解决方案是允许您为任何可选元素提供要更新的新值,同时保留未包含在更新请求中的列不变。 / p>

      为了使数据服务像这样工作,我们采取了以下措施:

      1. 使用#{NULL}作为值,为查询定义中的可选参数分配默认值:
      2.  <param defaultValue="#{NULL}" name="employeeNumber" ordinal="1" paramType="SCALAR" sqlType="INTEGER" type="IN"/>
        
        1. 在调用更新操作时,使用update语句中的ANSI SQL ISNULL()函数将值分配给您希望可能是可选的每个列(要保持不变):

          更新员工SET employeeNumber = ISNULL(?,employeeNumber),lastName = ISNULL(?,lastName),...其中employeeID =?;

          注意:您不会更改添加操作的插入语句

        2. 在更新操作期间,完全删除您希望保持不变的列的参数元素。在上面的定义中插入ISNULL()函数将比较NULL提供的第一个参数,如果参数不为null,则返回该参数的值。否则,该函数将返回第二个参数的值,在这种情况下,是您正在更新的表行中的现有值(保持该列的值不变)。

        3. e.g。要执行仅填充提供的员工编号但将其他列保留为其数据库架构默认值的添加操作,请调用以下操作:

           </body>
                <p:addEmployee xmlns:p="http://ws.wso2.org/dataservice/samples/rdbms_sample">
                     <!--Exactly 1 occurrence-->
                     <xs:employeeNumber xmlns:xs="http://ws.wso2.org/dataservice/samples/rdbms_sample">15432</xs:employeeNumber>
                </p:addEmployee>
           </body>
          

          e.g。要执行仅更新员工姓氏但将其他列保留为现有值的编辑操作,请调用以下操作:

           </body>
                <p:editEmployee xmlns:p="http://ws.wso2.org/dataservice/samples/rdbms_sample">
                     <!--Exactly 1 occurrence-->
                     <xs:employeeLastName xmlns:xs="http://ws.wso2.org/dataservice/samples/rdbms_sample">Jones</xs:employeeLastName>
                </p:editEmployee>
           </body>
          

          请注意,操作调用中不包含任何其他参数元素。

答案 1 :(得分:1)

作为一种解决方法,您可以在WSO2 ESB中创建代理服务,使用具有可选输入参数的WSDL,并验证它们是否存在,并采取措施。如果参数存在于请求消息中,则调用dataservice。我也像你一样搜索但没有结果。

相关问题