{"id":4047,"date":"2024-01-09T17:06:00","date_gmt":"2024-01-09T16:06:00","guid":{"rendered":"https:\/\/www.skillup.cloud\/?p=4047"},"modified":"2024-02-11T16:22:07","modified_gmt":"2024-02-11T15:22:07","slug":"table-function-su-iseries-esempi-di-come-incapsulare-le-logiche-di-business","status":"publish","type":"post","link":"https:\/\/www.skillup.cloud\/it\/table-function-su-iseries-esempi-di-come-incapsulare-le-logiche-di-business\/","title":{"rendered":"Table Function su iSeries &#8211; esempi di come incapsulare le logiche di business"},"content":{"rendered":"\n<p>Le funzioni tabella su iSeries sono una funzionalit\u00e0 potente che consente di incapsulare le logiche di business restituendo in forma tabellare il risultato di estrazioni utilizzabili all\u2019interno di altri comandi sql.<\/p>\n\n\n\n<p><br>Le funzioni tabella su iSeries possono essere utilizzate per una variet\u00e0 di scopi, tra cui:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Incapsulare logiche di business:&nbsp;Le funzioni tabella possono essere utilizzate per incapsulare logiche di business complesse,&nbsp;rendendole pi\u00f9 facili da comprendere e mantenere.<\/li>\n\n\n\n<li>Effettuare estrazioni dati:&nbsp;Le funzioni tabella possono essere utilizzate per effettuare estrazioni dati da una o pi\u00f9 tabelle,&nbsp;rendendole pi\u00f9 efficienti e facili da utilizzare.<\/li>\n\n\n\n<li>Crea report:&nbsp;Le funzioni tabella possono essere utilizzate per creare report complessi,&nbsp;rendendoli pi\u00f9 flessibili e facili da personalizzare.<\/li>\n<\/ul>\n\n\n\n<p>In altri post abbiamo gi\u00e0 parlato dell\u2019argomento:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.skillup.cloud\/table-function-in-ibm-iseries-come-ti-incapsulo-il-sistema-rendendolo-facilmente-accessibile-con-sql\/\" target=\"_blank\" rel=\"noreferrer noopener\">Table Function in IBM iSeries: come ti incapsulo il sistema rendendolo facilmente accessibile con SQL<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.skillup.cloud\/table-function-display_journal-swiss-army-knife-strumento-versatile-per-molte-situazioni\/\" target=\"_blank\" rel=\"noreferrer noopener\">Table Function DISPLAY_JOURNAL &#8211; Swiss Army Knife (strumento versatile per molte situazioni)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.skillup.cloud\/le-tabelle-definite-dallutente-udtf-in-ibm-iseries-un-approccio-innovativo-per-la-gestione-dei-dati\/\" target=\"_blank\" rel=\"noreferrer noopener\">Le Tabelle Definite dall&#8217;Utente (UDTF) in IBM iSeries: Un Approccio Innovativo per la Gestione dei Dati<\/a><\/li>\n<\/ul>\n\n\n\n<p>In questo post si vuole enfatizzare l\u2019utilizzo di funzionalit\u00e0 SQL che incapsulano le logiche di business restituendo in forma tabellare il risultato di estrazioni utilizzabili all\u2019interno di altri comandi sql.<\/p>\n\n\n\n<p>L&#8217;utilizzo delle Function Table in SQL su IBM iSeries (AS\/400) infatti pu\u00f2 arricchire notevolmente le query, permettendo di incorporare dati dinamici e calcolati in tempo reale all&#8217;interno di select pi\u00f9 complesse, inclusi join, subquery, condizioni where e altre costruzioni SQL.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Best Practices<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Le Function Table devono essere progettate in modo da essere efficienti, soprattutto se utilizzate in query complesse o su grandi set di dati.<\/li>\n\n\n\n<li>La complessit\u00e0 della funzione e la quantit\u00e0 di dati che restituisce possono influenzare le prestazioni della query.<\/li>\n\n\n\n<li>\u00c8 importante testare e ottimizzare le query, specialmente quando si combinano pi\u00f9 tabelle e function table in un&#8217;unica query.<\/li>\n<\/ul>\n\n\n\n<p>Di seguito alcuni esempi significativi di funzioni tabella su iSeries<\/p>\n\n\n\n<p>Nota: gli esempi presentati in questo post hanno scopo puramente didattico e illustrativo. Essi forniscono un&#8217;idea di come le funzioni possano essere utilizzate, ma non considerano tutte le possibili casistiche e situazioni che si possono verificare in un contesto reale.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"text-decoration: underline\"> <a href=\"https:\/\/www.skillup.cloud\/wp-admin\/post.php?post=4047&amp;action=edit#reportvendite\">Function Table per generare un report sulle vendite (uso in INNER JOIN)<\/a> <\/span><\/li>\n\n\n\n<li><span style=\"text-decoration: underline\"><a href=\"#log-utenti\"> Function Table per Log Utenti (uso in INNER JOIN)<\/a> <\/span><\/li>\n\n\n\n<li><span style=\"text-decoration: underline\"> <a href=\"#date-festive\">Function Table per Date Festive (uso in WHERE)<\/a> <\/span><\/li>\n\n\n\n<li><span style=\"text-decoration: underline\"> <a href=\"#sconti-prodotti\">Function Table per Calcolare Sconti sui Prodotti (uso in inner query)<\/a> <\/span> <\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\" id=\"reportvendite\"><strong>Function Table per generare un report sulle vendite (uso in INNER JOIN)<\/strong><\/p>\n\n\n\n<p id=\"function-table-per-generare-un-report-sulle-vendite\">La seguente funzione tabella genera un report sulle vendite per un periodo di tempo specificato:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">CREATE FUNCTION sales_report (\n    start_date DATE,\n    end_date DATE\n) RETURNS TABLE (\n    product_id INT,\n    quantity INT,\n    amount DECIMAL(10,2)\n)\nLANGUAGE SQL\nREADS SQL DATA\n  RETURN\n    SELECT\n        product_id,\n        SUM(quantity),\n        SUM(amount)\n    FROM\n        sales\n    WHERE\n        date &gt;= start_date\n        AND date &lt;= end_date\n    GROUP BY product_id;<\/pre>\n\n\n\n<p>Questa Funzione pu\u00f2 essere utilizzata per generare un report vendite: <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">SELECT p.product_id,\n       p.product_desc,\n       s.quantity,\n       s.amount\nFROM product_id, product_desc FROM products p\nINNER JOIN TABLE(sales_report('2023-01-01 00:00:00','2023-12-31 59:59:99')) AS s\nON s.product_id = p.product_id\nORDER BY 1;<\/pre>\n\n\n\n<p class=\"has-medium-font-size\" id=\"log-utenti\"><strong>Function Table per Log Utenti (uso in INNER JOIN)<\/strong><\/p>\n\n\n\n<p>La seguente funzione tabella restituisce i log relativi ad un determinato utente<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">CREATE FUNCTION FunzioneLogUtenti (\nUserID INT\n) RETURNS TABLE (\n    UserID INT,\n    InfoLog VARCHAR(255)\n)\nLANGUAGE SQL\nREADS SQL DATA\n  RETURN\n    SELECT\n        UserID,\n        InfoLog\n    FROM TabellaLog\n    WHERE UserID = FunzioneLogUtenti.UserID; <\/pre>\n\n\n\n<p>Questa Funzione pu\u00f2 essere utilizzata per generare un report dei log degli utenti:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">SELECT u.Nome,\n       u.Cognome,\n       l.InfoLog\n FROM TabellaUtenti AS u\n INNER JOIN TABLE(FunzioneLogUtenti(u.UserID)) AS l\n ON u.UserID = l.UserID; <\/pre>\n\n\n\n<p class=\"has-medium-font-size\" id=\"date-festive\"><strong>Function Table per Date Festive (uso in WHERE)<\/strong><\/p>\n\n\n\n<p>La seguente funzione tabella restituisce un elenco di date festive (supponiamo di avere una tabella avente le date festive a livello aziendale):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">CREATE FUNCTION FunzioneDateFestive (\n)\n RETURNS TABLE (\n    Data DATE\n)\nLANGUAGE SQL\nREADS SQL DATA\n  RETURN\n    SELECT\n        DataFestiva AS Data\n    FROM TabellaFestivit\u00e0;<\/pre>\n\n\n\n<p>La funzione tabella cos\u00ec creata pu\u00f2 essere utilizzata ad esempio un una condizione WHERE:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">SELECT *\nFROM TabellaOrdini\nWHERE exists (SELECT 1\n                FROM TABLE(FunzioneDateFestive())\n                WHERE DataOrdine = Data\n              );<\/pre>\n\n\n\n<p class=\"has-medium-font-size\" id=\"sconti-prodotti\"><strong>Function Table per Calcolare Sconti sui Prodotti (uso in inner query)<\/strong><\/p>\n\n\n\n<p>La seguente funzione tabella calcola lo sconto applicato a un prodotto identificato in base al suo ID<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">CREATE FUNCTION CalcolaSconto (\n    ProdottoID INT\n) RETURNS TABLE (\n    Sconto DECIMAL(5, 2)\n)\nLANGUAGE SQL\nREADS SQL DATA\n    RETURN\n      SELECT\n          CASE WHEN Categoria = 'Elettronica' THEN Prezzo * 0.1\n               WHEN Categoria = 'Libri'       THEN Prezzo * 0.05\n               ELSE 0\n           END AS Sconto\n      FROM TabellaProdotti\n      WHERE ID = CalcolaSconto.ProdottoID;<\/pre>\n\n\n\n<p>La funzione tabella cos\u00ec creata pu\u00f2 essere utilizzata ad esempio un una inner query (o subquery):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">SELECT p.Nome,\n       p.Prezzo,\n       (SELECT Sconto FROM TABLE(CalcolaSconto(p.ID))) AS ScontoApplicato\nFROM TabellaProdotti AS p<\/pre>\n\n\n\n<p>In questo esempio, la inner query calcola lo sconto per ogni prodotto basandosi sulla Function Table CalcolaSconto<\/p>\n\n\n\n<p><strong>Note Importanti<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Le definizioni delle Function Table qui mostrate sono semplificate e potrebbero richiedere adattamenti in base alle specifiche dell&#8217;ambiente iSeries e alla struttura dei dati.<\/li>\n\n\n\n<li>La sintassi SQL e le funzionalit\u00e0 possono variare a seconda della versione del DB2 e del sistema operativo iSeries.<\/li>\n\n\n\n<li>\u00c8 essenziale testare le Function Table e le query associate per assicurarsi che siano ottimizzate per le prestazioni, soprattutto in ambienti di produzione con grandi volumi di dati.<\/li>\n\n\n\n<li><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Le funzioni tabella su iSeries sono una funzionalit\u00e0 potente che consente di incapsulare le logiche di business restituendo in forma tabellare il risultato di estrazioni utilizzabili all\u2019interno di altri comandi sql. Le funzioni tabella su iSeries possono essere utilizzate per&#8230;<\/p>\n","protected":false},"author":3,"featured_media":4060,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[14,15,17],"tags":[40,46,122,123],"class_list":["post-4047","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-as400-architettura","category-gestire-as400-con-sql","category-piu-in-profondita","tag-iseries","tag-sql","tag-function-table","tag-create-function"],"_links":{"self":[{"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts\/4047","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/comments?post=4047"}],"version-history":[{"count":12,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts\/4047\/revisions"}],"predecessor-version":[{"id":4059,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts\/4047\/revisions\/4059"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/media\/4060"}],"wp:attachment":[{"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/media?parent=4047"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/categories?post=4047"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/tags?post=4047"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}