Show Menu
ARGOMENTI×

Aggiunta di funzioni SQL aggiuntive

Introduzione

Adobe Campaign consente all'utente di definire le proprie funzioni in grado di accedere alle funzioni SQL, sia quelle offerte dal database che quelle non già disponibili nella console. Questo è utile per le funzioni aggregate (media, massima, somma), ad esempio, che possono essere calcolate solo sul server o quando il database fornisce un modo più semplice per implementare determinate funzioni, piuttosto che scrivere l'espressione "manualmente" nella console (ad esempio, gestione delle date).
Questo meccanismo può essere utilizzato anche se si desidera utilizzare una funzione SQL del motore di database recente o non comune, che non è ancora disponibile nella console di Adobe Campaign.
Una volta aggiunte queste funzioni, verranno visualizzate nell'editor di espressioni come altre funzioni predefinite.
Le chiamate delle funzioni SQL nella console non vengono più inviate al server in modo naturale. Il meccanismo descritto qui diventa quindi l'unico modo per chiamare sul server di funzioni SQL non pianificato.

Installazione

Le funzioni da aggiungere si trovano in un file "package" in formato XML, la cui struttura è dettagliata nel paragrafo seguente.
Per installarlo dalla console, selezionate le opzioni Strumenti/Avanzate/Importa pacchetto dal menu, quindi selezionate Install from file , e seguite le istruzioni della procedura guidata di importazione.
Avviso: anche se l'elenco delle funzioni importate viene immediatamente visualizzato nell'editor delle funzioni, non saranno utilizzabili fino al riavvio di Adobe Campaign.

Struttura generale del pacchetto da importare

Le funzioni da aggiungere si trovano nel file ​"package" in formato XML. Esempio:
<?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>

  • Il nome , lo spazio dei nomi e l' etichetta sono solo a scopo informativo. Consentono di visualizzare un riepilogo del pacchetto nell'elenco dei pacchetti installati (Explorer/Amministrazione/Gestione pacchetti/Pacchetti installati).
  • I campi buildVersion e buildNumber sono obbligatori. Devono corrispondere al numero del server a cui è collegata la console. Queste informazioni sono disponibili nella casella "Aiuto/Informazioni su".
  • I seguenti blocchi, entità e funclist sono obbligatori. In funcList, i campi "name" e "namespace" sono obbligatori, ma il loro nome è lasciato alla decisione dell'utente, che designa in modo univoco l'elenco delle funzioni.
    Ciò significa che se viene importato un altro elenco di funzioni con la stessa coppia di nomi/nomi (qui "cus::myList"), le funzioni importate in precedenza verranno eliminate. Al contrario, se si modifica questa coppia nome/spazio nomi, la nuova serie di funzioni importate verrà aggiunta alla precedente.
  • L'elemento group consente di specificare il gruppo di funzioni nel quale verranno visualizzate le funzioni importate nell'editor delle funzioni. L'attributo @name può essere un nome già esistente (nel qual caso le funzioni verranno aggiunte al gruppo considerato) o un nuovo nome (nel qual caso apparirà in un nuovo gruppo).
  • Promemoria: i valori possibili per l'attributo @name nell' <group> elemento sono:
      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" )
    
    
Assicuratevi di completare l'attributo @label: questo è il nome che verrà visualizzato nell'elenco delle funzioni disponibili. Se non immettete nulla, il gruppo non avrà un nome. Tuttavia, se immettete un nome diverso da quello esistente, il nome dell’intero gruppo verrà modificato.
Se desiderate aggiungere funzioni a diversi gruppi diversi, potete fare in modo che diversi <group> elementi vengano tracciati nello stesso elenco.
Infine, un <group> elemento può contenere la definizione di una o più funzioni, ossia lo scopo del file del pacchetto. L’ <function> elemento è dettagliato nel seguente paragrafo.

Descrittore di funzione <funzione></funzione>

Il caso qui presentato è un caso generale in cui desideriamo fornire l'attuazione della funzione.
Di seguito è riportato un esempio di una funzione di "maturità relativa" che, utilizzando un'età, indica per quanti anni la persona è stata considerata matura.
 <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>

Il campo @name fa riferimento al nome della funzione, e "args" è l'elenco di parametri che verranno visualizzati nella descrizione. In questo caso, la funzione verrà visualizzata come "relativeMaturity ( <age> )" nella finestra di selezione della funzione.
  • help è il campo visualizzato nella parte inferiore della finestra dell'editor di espressioni.
  • @display è un messaggio informativo.
    Negli attributi @help e @display, la stringa "$1" rappresenta il nome fornito nel parametro della prima funzione (qui, "Age"). $2, $3... rappresentano i seguenti parametri. Nell'attributo @body illustrato di seguito, $1 indica il valore dell'argomento passato alla funzione durante la chiamata.
    La descrizione deve essere una stringa di caratteri XML validi: notare l'uso di '<' e '>' invece di < e >.
  • @type è il tipo restituito dalla funzione ed è un valore standard (long, string, byte, datetime...). Se viene omesso, il server determina il tipo migliore tra i tipi disponibili all'interno dell'espressione che implementa la funzione.
  • @minArgs e maxArgs indicano il numero di parametri (minimo e massimo) per un parametro. Ad esempio, per una funzione con 2 parametri, minArgs e maxArgs saranno 2 e 2. Per 3 parametri, più 1 opzionale, saranno rispettivamente 3 e 4.
  • Infine, l'elemento providerPart fornisce l'implementazione della funzione.
    • L'attributo provider è obbligatorio, specifica i sistemi di database per i quali viene fornita l'implementazione. Come illustrato nell'esempio, quando le sintassi delle espressioni o le funzioni sottostanti differiscono, è possibile fornire implementazioni alternative in base al database.
    • L'attributo @body contiene l'implementazione della funzione. Nota: questa implementazione deve essere un'espressione, nella lingua del database (non un blocco di codice). A seconda dei database, le espressioni possono essere sottoquery ("(selezionare la colonna dalla tabella dove...)") che restituiscono solo un singolo valore. Ad esempio, questo è il caso in Oracle (la query deve essere scritta tra parentesi).
    Se solo uno o due database verranno probabilmente interrogati dalla funzione definita, sarà sempre possibile fornire solo le definizioni corrispondenti a tali database.

Descrittore di funzione 'Pass-through'

Un descrittore di funzione speciale è il blocco "pass-through" , con un sistema di database "provider" non specificato. In questo caso, l'implementazione "body" può contenere solo una singola chiamata di funzione con una sintassi che non dipende dal database utilizzato. Nel frattempo, il blocco "ProviderPart" è univoco.
    <function name="CountAll" args="()" help="Counts the values returned (all fields together)"
              type="long" minArgs="0" maxArgs="0">
      <providerPart body="Count(*)"/>
    </function>

In questo caso, l'aggiunta di una funzione serve solo a rendere visibile al client una funzione del database che non sarebbe stata disponibile per impostazione predefinita.

Esempi

Ulteriori esempi di funzioni sono disponibili nel pacchetto predefinito "xtkdatakitfuncList.xml".