2014-10-17 69 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