新增其他 SQL 函式

簡介

Adobe Campaign可讓使用者定義​其自己的函式,以存取資料庫提供的函式和主控台中尚未提供的函式。 例如,這對聚合函式(平均、最大、總和)非常有用,只能在伺服器上計算,或者當資料庫提供實現某些函式的更簡單方法時,而不是在控制台中「手動」寫入表達式(如日期管理)。

如果您想要使用Adobe Campaign主控台尚未提供的最近或不常見的資料庫引擎SQL函式,也可以使用此機制。

在新增這些函式後,它們就會像其他預先定義的函式一樣出現在運算式編輯器中。

重要

控制台中的SQL函式調用不再自然地發送到伺服器。 因此,此處所述的機製成為在計畫外SQL函式伺服器上調用​的唯一方法。

安裝

要添加的函式位於​"package"檔案中,其結構在以下段落中詳細說明。

要從控制台進行安裝,請從菜單中選擇​工具/高級/導入包​選項,然後選擇​Install from file ,並遵循導入嚮導中的說明。

重要

警告:即使匯入的函式清單立即顯示在函式編輯器中,在Adobe Campaign重新啟動之前,這些函式將無法使用。

要導入的包的一般結構

要添加的函式可在​"package"檔案​中找到,格式為XML。 以下是範例:

<?xml version="1.0" encoding='ISO-8859-1' ?>
<!-- ===========================================================================
  Additional SQL functions for Adobe Campaign
  ========================================================================== -->
<package
  namespace   = "nms"
  name        = "package-additional-funclist"
  label       = "Additional functions"
  buildVersion= "6.1"
  buildNumber = "10000">

  <entities schema="xtk:funcList">
    <funcList name="myList" namespace="cus">
      <group name="date" label="Personalized date">
        <function name="relativeMaturity" type="long" args="(<Âge>)" help="Returns the difference between a date and 18 years"
                  minArgs="1" maxArgs="1" display="Relative maturity of the person born on the date $1">
          <providerPart provider="MSSQL,Sybase,PostgreSQL" body="extract(year from age($1))-18"/>
        </function>
      </group>
    </funcList>
  </entities>
</package>
  • namenamespace​和​label​僅用於資訊用途。 它們可讓您在已安裝的軟體包清單中查看軟體包的摘要(Explorer/Administration/Package management/Installed軟體包)。

  • buildVersion​和​buildNumber​欄位是必填欄位。 它們必須與控制台所連接的伺服器號相對應。 此資訊可在「說明/關於」方塊中找到。

  • 以下塊(entities​和​funclist)是強制的。 在funcList中,「name」和「namespace」欄位是必填欄位,但其名稱由用戶決定,並且它們唯一地指定了函式清單。

    這表示,如果匯入另一個具有相同namespace/name對(此處為"cus::myList")的函式清單,則先前匯入的函式將會刪除。 相反地,如果更改此namespace/name對,則新的一系列導入函式將添加到上一個函式。

  • group​元素可讓您指定在函式編輯器中顯示所導入函式的函陣列。 @name屬性可以是已存在的名稱(在這種情況下,函式將添加到被考慮的組)或新名稱(在這種情況下,該名稱將出現在新組中)。

  • 提醒:<group>元素中@name屬性的可能值為:

      name="aggregate"      ( label="Aggregates"         )
      name="string"             ( label="String"           )
      name="date"               ( label="Date"             )
      name="numeric"          ( label="Numeric"        )
      name="geomarketing" ( label="Geomarketing"     )
      name="other"              ( label="Others"           )
      name="window"          ( label="Windowing functions" )
    
重要

請確定填寫@label屬性:這是將顯示在可用函式清單中的名稱。 如果您未輸入任何內容,則群組將沒有名稱。 不過,如果您輸入的名稱不是現有名稱,則整個群組的名稱將會變更。

如果您想要將函式新增至數個不同的群組,可讓多個<group>元素在同一清單中受到追蹤。

最後,<group>元素可包含一個或多個函式的定義,即軟體包檔案的目的。 <function> 元素詳見下段。

函式描述符<function></function>

這裡介紹的案例是一般案例,我們希望提供​函式實現

以下是"相對成熟度"函式的範例,使用年齡來指出該人被認為成熟的年份。

 <function name="relativeMaturity" type="long" args="(<Âge>)" help="Returns the difference between a date and 18 years"
              minArgs="1" maxArgs="1" display="Relative maturity of the person born on the date $1">
       <providerPart provider="PostgreSQL" body="extract(year from age($1))-18"/>
       <providerPart provider="MSSQL,Sybase,Teradata" body="[Other implementation]"/>
    </function>

@name​欄位會參照函式的名稱,而"args"則是說明中顯示的參數清單。 在這種情況下,函式將在函式選擇窗口中顯示為"relativeMaturity(<age>)"。

  • 助是表達式編輯器窗口底部顯示的欄位。

  • @ display是資訊性訊息。

    注意

    在@help和@display屬性中,字串"$1"代表第一個函式參數(此處為"Age")中指定的名稱。 二,三……表示下列參數。 在下面詳細的@body屬性中,$1表示在調用期間傳遞給函式的引數值。

    注意

    說明必須是有效XML字元的字串:請注意使用'<'和'>',而非<和>。

  • @ type是函式返回類型,是標準值(long、string、byte、datetime…)。如果省略,則伺服器將在實現函式的表達式中確定可用類型的最佳類型。

  • @ minArgsand ​maxArgs指定參數的參數數(最小和最大)。例如,對於具有2個參數的函式,minArgs和maxArgs將是2和2。 若是3個參數,加上1個可選參數,則分別為3和4。

  • 最後,providerPart​元素提供函式實作。

    • provider​屬性是必需的,它指定為其提供實施的資料庫系統。 如示例所示,當表達式語法或基礎函式不同時,可以根據資料庫提供替代實現。
    • @body​屬性包含函式實作。 請注意:此實作必須是以資料庫語言(而非程式碼區塊)表示的運算式。 根據資料庫,表達式可以是僅返回單個值的子查詢("(從表中選擇列……)")。 例如,Oracle中就是這種情況(查詢必須用括弧寫入)。
    注意

    如果定義的函式可能只查詢一或兩個資料庫,則我們始終只能提供與這些資料庫對應的定義。

「直通」函式描述符

特殊函式描述符是​"pass-through"​塊,具有未指定的"provider"資料庫系統。 在此例中,"body"實作只能包含單一函式呼叫,其語法與所使用的資料庫無關。 同時,「ProviderPart」區塊是唯一的。

    <function name="CountAll" args="()" help="Counts the values returned (all fields together)"
              type="long" minArgs="0" maxArgs="0">
      <providerPart body="Count(*)"/>
    </function>

在這種情況下,添加函式僅用於使資料庫函式成為預設情況下不可用的函式,現在對客戶端可見。

範例

在預先定義的套件"xtkdatakitfuncList.xml"中,可找到更多函式範例。

本頁內容