PL/SQL

Nested Table

In PL SQL esiste ed adattabile collection di dati : le Nested table. Nested table è simile ad un array monodimensionali ma con alcune differenze: – Un array deve dichiarare il numero degli elementi – la nested table no. La grandezza di una nested table può essere incrementata usando il metodo extend (vedi in basso). – Un array deve avere gli elementi sempre consecutivi – una Nested table ha gli elementi consecutivi all’inizio ma poi diventano sparsi quando alcuni di questi elementi vengono cancellati. Di seguito un esempio della sintassi da usare per la creazione di una nested table : Continua a leggere

Oracle PL / SQL: cursori impliciti vs cursori espliciti

PL / SQL emette un cursore implicito ogni volta che si esegue un’istruzione SQL direttamente nel codice, fintanto che il codice non utilizza un cursore esplicito. Si chiama un cursore “implicito”, perché non si dichiara esplicitamente un cursore per l’istruzione SQL. Se si utilizza un cursore implicito, Oracle apre, recupera, e chiude in modo automatico; queste azioni sono al di fuori del vostro controllo programmato. È possibile, tuttavia, ottenere informazioni circa l’istruzione SQL di più recente esecuzione esaminando i valori in SQL , come spiegato più avanti in questo capitolo. Cursore implicito è più semplice di codice, ma pecca di: Continua a leggere

Goal Search Algorithm

Descrizione: L’algoritmo di ricerca Goal è l’algoritmo di ricerca del limite di una sequenza monotona crescente limitata superiormente. Finalità: Ricerca del limite di una sequenza monotona crescente limitata superiormente. Esempio: Supponiamo di voler creare una torre di 10 metri con una tolleranza di 10 millimetri, avendo un dato numero di mattoni, ciascuno di altezza differente, impilati uno sull’altro. Per costruire la torre saremo quindi obbligati ad utilizzare i mattoni seguendo un accesso Last In First Out Supponiamo di chiamare questa pila di mattoni XdataTable: 908 906 832 454 464 522 45 229 5057 433 930 214 1 1 1 2 Continua a leggere

Nascondere il codice Pl/Sql sorgente

Per nascondere il codice PlSql sorgente si possono usare due metodi: Offuscamento dinamico wrap utility E’ possibile effettuare il wrap di diversi oggetti PlSql al fine di proteggere il codice. Una volta effettuato il wrap, il codice non può più essere visualizzato tramite viste del data dictionary [ *_SOURCE ]. E’ possibile offuscare questi tipi di oggetti Package specifications Package body Type specification Type body Function Procedure Esistono comunque alcune utility per poter leggere il codice offuscato, quindi questo metodo non garantisce un alto livello di sicurezza. Alcune limitazioni sono Mancanza di retrocompatibilità Non funziona con i trigger Alcune linee Continua a leggere

Flusso di esecuzione di un’istruzione sql

  Il flusso di esecuzione può essere diviso in quattro fasi. Non tutte le istruzioni Sql le prevedono tutte e quattro: Parse: all’inizio l’istruzione deve venire analizzata, ovvero subire il controllo della sintassi e venire associata al cursore. Viene anche valutata la correttezza dei privilegi e l’esistenza degli oggetti referenziati Bind: questa fase è presente solo qualora l’istruzione preveda dati in input da fornire a runtime. Per ogni placeholder, dovrà essere fornito un valore per completare l’istruzione Execute:a questo punto il server esegue l’istruzione. Questa è l’ultima fase per tutte le operazioni SQL eccetto la SELECT Fetch:questa operazione recupera tutte Continua a leggere

Create trigger su eventi di sistema

Gli eventi di sistema sono stati del database che possono venire usati per attivare dei trigger. E’ possibile creare trigger per questi tipi di evento sia a livello di DATABASE che di SCHEMA. Quando si verifica l’evento scatenante, il database aprirà un transaction scope autonomo, attiverà il trigger ed effettuarà il commit di tutte le transazioni contenute nel trigger stesso. Gli eventi di sistema disponibili sono: AFTER STARTUP Il trigger è attivato all’apertura del database. Questo evento è valido solo a livello di DATABASE, non di SCHEMA BEFORE SHUTDOWN Il trigger è attivato dallo shutdown di un’istanza del database. Questo Continua a leggere

A simple procedure for create a flat csv file from table

Normal 14 false false false IT X-NONE X-NONE /* Style Definitions */ table.MsoNormalTable {mso-style-name:”Tabella normale”; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:””; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:”Calibri”,”sans-serif”; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:”Times New Roman”; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin;} Sometimes can be useful to produce a CSV file semicolon separated from a table. Here a simple dynamic procedure that works without write sql scripts pl sql code. Just put in some parameters and execute it from everywhere. With little customizations you can add a parameter for separator, add “” for strings, columns to avoid etc. Normal 14 false Continua a leggere

AUTHID property

La property AUTHID di un sottoprogramma PLSQL determina le autorizzazioni con le quali esso opera a run-time. Si possono usare due clausule:  . CURRENT_USER : quando il sottoprogramma viene eseguito avrà i diritti dell’utente che ha invocato il codice, non quelli del creatore  . DEFINED : quando il sottoprogramma viene eseguito non avrà i diritti dell’utente che ha invocato il codice, bensì quelli del creatore (trigger e viste si comportano sempre così). Questo è il default per AUTHID.  Qui sotto c’è un esempio di un programma creato utilizzando la property AUTHID. CREATE OR REPLACE PROCEDURE create_emp ( … parameters … Continua a leggere

Create an Index By Table of Record

An index by table is an associative array. An associative array never has more than two columns: the variable being indexes and the index value. However you can combine a record with an associative array to tie multiple values to the same index.   In this case the array still has a variable and an index, but the record variable now contains multiple distinct values. In the below example you’ll see how to associate a record to an associative array.   DECLARE   TYPE r_impiegati IS RECORD (                         Continua a leggere