Parameters WSO2数据服务服务器sql更新的可选输入参数

Parameters WSO2数据服务服务器sql更新的可选输入参数,parameters,wso2,optional,Parameters,Wso2,Optional,我有一个执行“编辑”操作的sql。如果存在值,则编辑功能应更新,如果不存在则忽略,因此需要可选输入参数。要使此功能正常工作,我需要让Data Services服务器生成一个wsdl/xsd,其中的参数可以出现0次或更多次,但似乎我只能让它生成一个请求,该请求需要在所有输入参数上出现1次或更多次。这意味着编辑操作需要每个字段,而不是只发送那些要更新的字段 这是以前的!建议在param元素上使用defaultValue作为生成可选输入参数的方法 下面的代码片段显示了wso2数据服务服务器附带的rdb

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

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

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


在员工(employeeNumber、lastName、firstName、email、salary)中插入值(:employeeNumber、:lastName、:firstName、:email、:salary)

作为一种解决方法,您可以在WSO2 ESB中创建一个代理服务,使用具有可选输入参数的WSDL,验证它们是否存在,并对其采取措施。如果参数出现在请求消息中,则调用数据服务。我也在搜索与您相同但没有结果的内容。

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

  • 规定是否允许列包含空值,以及
  • 如果未指定初始值,则应为列指定什么默认值
  • 根据数据库模式,我将这两个特性称为列的“可空”特性,另一个特性称为列的“默认值”特性。大多数现代数据库引擎都提供了这些特征的定义,并允许两者的任意组合存在。(进一步讨论这两个特征的结果组合超出了我们当前问题的范围。)

    接下来,WSO2 DSS中使用的数据服务资源语言(DSRL)是XML的派生。DSRL用于定义服务的查询和操作。定义服务定义的查询部分时,可以为参数元素指定文字默认值或内部属性值。文本默认值的一个示例是defaultValue=“1500”。定义的内部属性值为:#{USERNAME}、#{NULL}、#{TENANT_ID}和#{USER_ROLES}。有关详细信息,请参阅此URL:

    对于add和update查询,您都需要将defaultValue=#{NULL}分配给希望作为操作调用可选的任何参数。注意,对于add,您需要

  • 为查询定义中未指定defaultValue的元素提供值,或
  • 确保在数据库架构中指定默认值,或最终
  • 根据数据库架构,该列可以为空
  • 正如您所注意到的,参数元素似乎必须全部出现在请求中,但是这不一定是真的。你之前提到的帖子在结尾处写道“你可以调用'GetEmployeeNumber'而不调用'employeeNumber'并获取所有员工”。含义:您根本不必在操作请求中包含该元素,即使在创建数据服务期间插入的说明“恰好发生1次”的文档让您相信这一点

    对于INSERT(添加操作)和UPDATE(编辑操作),如果在查询定义中添加一个默认值#{NULL},实际上它会在一定程度上使参数元素成为可选的。可选,在操作调用中根本不必提供元素的上下文中。但是,如果在SQL UPDATE语句中不处理这些可选参数之一中包含的空值,则仍会在数据库中引发SQL错误

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

    为了使数据服务像这样工作,我们做了以下工作:

  • 在查询定义中为可选参数指定一个默认值,使用#{NULL}作为值:
  • 
    
  • 在update语句中使用ANSI SQL ISNULL()函数,将值分配给在调用update操作时可能希望为可选(希望保持不变)的每一列:

    更新员工集employeeNumber=ISNULL(?,employeeNumber),lastName=ISNULL(?,lastName)。。。其中employeeID=

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

  • 完全删除要在更新操作期间保持不变的列的参数元素。在上述定义中插入ISNULL()函数将比较提供的第一个参数与NULL,如果该参数不是NULL,则返回该参数的值。否则,该函数将返回第二个参数的值,在本例中为正在更新的表行中的现有值(保持该列的值不变)

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