Skapa tabell-DDL med Execute Immediate
Det finns två sätt att skriva en Skapa tabell DDL-fråga för Execute Immediate-satsen för Native Dynamic SQL i Oracle Database. Vi har redan diskuterat en av dem i den senaste handledningen. Det första sättet som vi diskuterade i föregående handledning är förmodligen det enklaste sättet att skriva en SQL-fråga för Dynamic SQL. Men det hindrar oss inte från att lära oss mer. Så låt oss gå vidare och lära oss den andra.
Så i den här handledningen kommer vi att lära oss den andra metoden att skriva en CREATE TABLE DDL för dynamisk körning med Execute Immediate Statement.
Eftersom denna handledning är en fortsättning på den tidigare, så ber jag dig att gå igenom den bloggen först för en bättre förståelse. Med det sagt, låt oss börja handledningen.
Steg 1:Förbered CREATE TABLE DDL.
Förbered din SQL-fråga i förväg som du vill köra dynamiskt. Detta kommer att minska kodförvirringen och även minimera det syntaktiska felet.
CREATE TABLE tut_83 ( tut_num NUMBER(5), tut_name VARCHAR2 (50), CONSTRAINT cons1_col1_pid_pk PRIMARY KEY (tut_num) )
Här är vår CREATE TABLE DDL. Förutom det ändrade namnet och en tillagd primärnyckelrestriktion är denna DDL ganska lik den vi skapade i den senaste handledningen.
Steg 2:Skriv PL/SQL-blocket för dynamisk exekvering av DDL-satsen.
Nu när vi har vår CREATE TABLE DDL förberedd. Låt oss skriva PL/SQL-programmet för att köra det dynamiskt.
SET SERVEROUTPUT ON; DECLARE ddl_qry VARCHAR2(150); BEGIN ddl_qry := 'CREATE TABLE tut_83('|| 'tut_num NUMBER(3),'|| 'tut_name VARCHAR2(50)'|| ')'; EXECUTE IMMEDIATE ddl_qry; END; /
Låt oss se vad vi gjorde i det här programmet.
Deklarationssektionen .
DECLARE ddl_qry VARCHAR2 (150);
I deklarationsdelen av vårt PL/SQL-block deklarerade vi en variabel med namnet ddl_qry. Den här variabeln kommer att hålla vår CREATE TABLE DDL som vi kommer att köra med Execute Immediate-satsen.
Enligt den senaste handledningen behandlar Execute Immediate alla SQL-satser som en sträng av VARCHAR2-datatypen. Det är därför vi hade deklarerat vår variabel ddl_qry som VARCHAR2-datatyp.
Utförandesektionen.
Direkt efter deklarationssektionen har vi vår avrättningssektion där allt det roliga händer.
BEGIN ddl_qry := 'CREATE TABLE tut_83 ('|| 'tut_num NUMBER (5),'|| 'tut_name VARCHAR2 (50),'|| 'CONSTRAINT cons1_col1_pk PRIMARY KEY (tut_num)'|| ')'; EXECUTE IMMEDIATE ddl_qry; END; /
Denna exekveringssektion består av endast två satser:
- Uppdragsbeskrivning
- Utför omedelbart uttalande
Den första satsen som är "Assignment Statement" gör denna kod annorlunda än den föregående. Låt oss se vad dessa uttalanden är.
Uttalande 1:Uppdragsförklaring.
ddl_qry := 'CREATE TABLE tut_83 ('|| 'tut_num NUMBER (5),'|| 'tut_name VARCHAR2 (50),'|| 'CONSTRAINT cons1_col1_pk PRIMARY KEY (tut_num)'|| ')';
Detta är det enda uttalandet som gör att detta PL/SQL-program skiljer sig från det som vi såg i föregående handledning.
I detta uttalande tilldelar vi CREATE TABLE DDL till variabeln ddl_qry. Så vad är annorlunda här?
I den tidigare metoden omslöt vi hela vår DDL-sats i ett par enkla citat ( ' ' ). Så här
ddl_qry:= 'CREATE TABLE tut_82 ( tut_num NUMBER(3), tut_name VARCHAR2 (50) )';
Första sättet att skriva en DDL-fråga
Medan här i den andra metoden istället för att linda in hela frågan i enstaka citattecken delade vi först upp den i flera strängar av VARCHAR2. Detta gjorde vi genom att slå in varje enskild rad i frågan i enstaka citattecken. Därefter sammanfogade vi dem alla genom att använda sammanlänkningsoperatorn ( || ) så att PL/SQL-motorn kör dem som en enda enhet.
Du kan se en detaljerad demonstration av denna break and conquer-metod för dynamiskt utförande i videohandledningen.
Föreslagen läsning:Concat-funktion kontra Concat-operatör.
Utlåtande 2:Utför omedelbart uttalande.
Vårt andra uttalande är Execute Immediate statement. Den exekverar alla SQL-satser som returnerar en rad av resultatet dynamiskt. I vårt fall exekverar denna sats en CREATE TABLE DDL-fråga genom ett PL/SQL-block.
Det finns bara två sätt att exekvera en DDL-sats genom ett PL/SQL-block i Oracle Database. Antingen genom att använda DBMS_SQL-paketet eller Execute Immediate of Native Dynamic SQL. Läs här för att veta vad du mer kan göra med Execute Immediate.
För att köra en DDL dynamiskt måste du först skriva den reserverade frasen "Execute Immediate". Följt av variabelnamnet som du har lagrat din DDL i som vi gjorde ovan.
Kontrollera om tabellen är skapad eller inte.
Det finns flera sätt att kontrollera om PL/SQL-blocket körde CREATE TABLE DDL framgångsrikt eller inte. Men här ska jag visa dig de två enklaste och populäraste sätten.
Använda kommandot DESCRIBE
Det enklaste sättet att kontrollera om PL/SQL-blocket har skapat tabellen tut_83 framgångsrikt eller inte, är att använda kommandot DESCRIBE. Kommandot Describe visar strukturen för den nämnda tabellen, bara om den finns, annars returnerar den ett fel.
Låt oss prova det
DESCRIBE tut_83; Or DESC tut_83
Om du vid exekvering av ovanstående describe-kommando ser strukturen för tabellen tut_83 betyder det att ovanstående PL/SQL-block har skapat tabellen. Men om du får ett felmeddelande betyder det att du trasslat till någonstans och att exekveringen av PL/SQL-blocket inte lyckas.
Använder ALL_OBJECTS dataordbok.
Du kan också fråga ALL_OBJECTS dataordbok. Detta hjälper till att ta reda på om den önskade tabellen eller något annat objekt du försöker skapa skapas eller inte. Så här
SELECT 'We created a table with name '||object_name||' in ' ||owner||' schema on '||created FROM all_objects WHERE object_name ='TUT_83';
Dessa är två av många sätt att ta reda på om det önskade objektet har skapats framgångsrikt.
En sak till innan du avslutar den här handledningen. Vänligen läs den tidigare bloggen för bättre förståelse av detta såväl som de kommande handledningarna.
Det är PL/SQL-handledningen om det andra sättet att skriva en CREATE TABLE DDL för Execute Immediate-satsen för Native Dynamic SQL i Oracle Database.
Hoppas du tyckte om att läsa. Se till att prenumerera på YouTube-kanalen. För i nästa självstudie kommer vi att lära oss hur man släpper och modifierar schemaobjekt dynamiskt.
Tack och ha en bra dag!