2014-10-17 50 views
2

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

This Previous post!建议在param元素上使用defaultValue作为生成可选输入参数的一种方式。

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

<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>

当观察片断下面请注意,如文档,似乎表明当默认值是存在的薪水期待恰好一个发生不是0或1发生。

<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>

什么我需要做的,使所有上添加/更新可选的情况下上述参数。

回答

1

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

2

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

  1. 开一列是否允许包含NULL值或没有,
  2. 如果未指定初始值,什么默认值应被分配到一列。

根据数据库模式,我将这两个视为“可空”特性,另一个视为列的“默认值”特性。大多数现代数据库引擎都提供了这些特性的定义,并允许两者的任何组合存在。 (关于这两个特性的最终组合的进一步讨论超出了我们现有问题的范围。)

接下来,WSO2 DSS中使用的数据服务资源语言(DSRL)是XML的派生物。 DSRL用于定义服务的查询和操作。定义服务定义的查询部分时,可以为参数元素分配文字默认值或内部属性值。字面默认值的例子是defaultValue =“1500”。定义的内部属性值包括:#{USERNAME},#{NULL},#{TENANT_ID}和#{USER_ROLES}。看到这个网址了解详情: https://docs.wso2.com/display/DSS311/Adding+Input+Mappings

为您的添加和更新查询,您将需要一个默认值=#{NULL}分配给你想成为可选的操作调用的参数。需要注意的是为补充,你要么需要

  1. 提供对这些元素的值没有被分配在查询定义一个默认值或
  2. 确保默认值是在数据库架构中指定,或最终
  3. 每数据库架构列可以为空

正如你提到的,看来参数元素都必须在请求,然而,这未必是真实的。您在前面提到的帖子中指出:“您可以在没有'employeeNumber'的情况下调用'getEmployees'并获取所有员工”。含义:即使在创建数据服务期间插入的说明“恰好出现一次”的文档导致您相信,您也不必将操作请求包含在操作请求中。

对于INSERT(添加操作)和UPDATE(编辑操作),如果在查询定义中添加#{NULL}的defaultValue,它实际上会使参数元素成为可选范围。可选,在操作调用中不需要提供元素的环境中。但是,如果您不在SQL UPDATE语句中处理包含在其中一个可选参数中的NULL值时,这仍会在您的数据库上引发SQL错误。

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

为了使这样的数据服务工作,这里就是我们所做的:

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

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

    注意:您不会改变插入语句为您添加操作

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

  • 例如,要执行添加操作,仅填充一个提供员工编号,但保留其他列的数据库模式的默认值,你调用的操作是这样的:

    </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> 
    

    例如要进行编辑操作,只有更新员工的姓氏,但保留其他列其现有的值,你调用的操作是这样的:

    </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:addEmployee> 
    </body> 
    

    注意,没有其他的参数元素被列入操作呼叫。

    +0

    请参阅http://stackoverflow.com/questions/19326683/using-input-parameter-as-an-optional-input – 2016-05-04 17:44:19