Definire ulteriori funzioni SQL adding-additional-sql-functions
Adobe Campaign consente all'utente di definire le proprie funzioni che possono accedere alle funzioni SQL, sia quelle offerte dal database che quelle non già disponibili nella console. Questo è utile per le funzioni di aggregazione (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, anziché scrivere "manualmente" l’espressione nella console (ad esempio, gestione delle date).
Questo meccanismo può essere utilizzato anche se desideri utilizzare una funzione SQL recente o non comune del motore di database, non ancora disponibile nella console Adobe Campaign.
Una volta aggiunte, queste funzioni verranno visualizzate nell’editor espressioni come altre funzioni predefinite.
Installazione installation
Le funzioni da aggiungere si trovano in un file "package" in formato XML, la cui struttura è descritta nel paragrafo seguente.
Per installarlo dalla console, selezionare le opzioni Strumenti/Avanzate/Importa pacchetto dal menu, quindi Install from file e seguire le istruzioni dell'Assistente all'importazione.
Struttura generale del pacchetto da importare general-structure-of-package-to-import
Le funzioni da aggiungere si trovano nel file "package" in formato XML. Ecco un 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= "7.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>
-
name, namespace e label sono solo a scopo informativo. Consentono di visualizzare un riepilogo del pacchetto nell'elenco dei pacchetti installati (Explorer/Administration/Package management/Installed packages).
-
I campi buildVersion e buildNumber sono obbligatori. Devono corrispondere al numero del server a cui è connessa la console. Queste informazioni sono disponibili nella casella "Help/About" (Guida/Informazioni).
-
I seguenti blocchi, entities e funclist sono obbligatori. In funcList, i campi "name" e "namespace" sono obbligatori, ma il loro nome è lasciato alla scelta dell’utente e designano in modo univoco l’elenco delle funzioni.
Ciò significa che se viene importato un altro elenco di funzioni con la stessa coppia spazio dei nomi/nome (in questo caso "cus::myList"), le funzioni precedentemente importate verranno eliminate. Viceversa, se si modifica questa coppia spazio dei nomi/nome, la nuova serie di funzioni importate verrà aggiunta a quella precedente.
-
L'elemento group consente di specificare il gruppo di funzioni in cui le funzioni importate verranno visualizzate nell'editor di 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 verrà visualizzato in un nuovo gruppo).
-
Promemoria: i valori possibili per l'attributo @name nell'elemento
<group>
sono:code language-none 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" )
Se si desidera aggiungere funzioni a diversi gruppi, è possibile tenere traccia di diversi elementi <group>
nello stesso elenco.
Infine, un elemento <group>
può contenere la definizione di una o più funzioni, ovvero lo scopo del file del pacchetto. <function>
è descritto nel paragrafo seguente.
Descrittore di funzione <function></function> function-descriptor--function-
Il caso presentato qui è un caso generale in cui si desidera fornire l'implementazione della funzione.
Di seguito è riportato un esempio di 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 dei 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 espressioni.
-
@display è un messaggio informativo.
note note NOTE Negli attributi @help e @display, la stringa "$1" rappresenta il nome specificato nel primo parametro della funzione (in questo caso, "Age"). $2, $3… rappresenterebbero i seguenti parametri. Nell’attributo @body descritto di seguito, $1 indica il valore dell’argomento passato alla funzione durante la chiamata. note note NOTE La descrizione deve essere una stringa di caratteri XML validi: nota l’utilizzo 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 facoltativo, saranno rispettivamente 3 e 4.
-
Infine, l'elemento providerPart fornisce l'implementazione della funzione.
- L'attributo provider è obbligatorio e specifica i sistemi di database per i quali viene fornita l'implementazione. Come mostrato 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 nel linguaggio del database (non un blocco di codice). A seconda dei database, le espressioni possono essere sottoquery ("(seleziona una colonna dalla tabella dove…)") che restituiscono un solo valore. Questo è il caso, ad esempio, dell’Oracle (la query deve essere scritta tra parentesi).
note note NOTE Se è probabile che solo uno o due database vengano interrogati dalla funzione definita, è sempre possibile fornire solo le definizioni corrispondenti a tali database.
Descrittore di funzione "Pass-through" pass-through--function-descriptor
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 una funzione di database che non sarebbe stata disponibile per impostazione predefinita, ora visibile al client.
Esempi examples
Ulteriori esempi di funzioni sono disponibili nel pacchetto predefinito "xtkdatakitfuncList.xml".