Opret tabel DDL med Execute Immediate
Der er to måder at skrive en Opret tabel DDL-forespørgsel til Execute Immediate-sætning af Native Dynamic SQL i Oracle Database. Vi har allerede diskuteret en af dem i den sidste tutorial. Den første måde, som vi diskuterede i den forrige tutorial, er sandsynligvis den nemmeste måde at skrive en SQL-forespørgsel til Dynamic SQL. Men det forhindrer os ikke i at lære videre. Så lad os gå videre og lære den anden.
Så i denne øvelse lærer vi den anden metode til at skrive en CREATE TABLE DDL til dynamisk udførelse ved hjælp af Execute Immediate Statement.
Da denne tutorial er i forlængelse af den forrige, beder jeg dig derfor venligst gå gennem den blog først for en bedre forståelse. Når det er sagt, lad os starte selvstudiet.
Trin 1:Forbered CREATE TABLE DDL.
Forbered din SQL-forespørgsel på forhånd, som du ønsker at udføre dynamisk. Dette vil reducere kodeforvirringen og også minimere den syntaktiske fejl.
CREATE TABLE tut_83 ( tut_num NUMBER(5), tut_name VARCHAR2 (50), CONSTRAINT cons1_col1_pid_pk PRIMARY KEY (tut_num) )
Her er vores CREATE TABLE DDL. Bortset fra det ændrede navn og en tilføjet primærnøglebegrænsning ligner denne DDL stort set den, vi oprettede i det sidste selvstudie.
Trin 2:Skriv PL/SQL-blokken til dynamisk udførelse af DDL-sætningen.
Nu hvor vi har vores CREATE TABLE DDL forberedt. Lad os skrive PL/SQL-programmet til at udføre det dynamisk.
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; /
Lad os se, hvad vi gjorde i dette program.
Erklæringsafsnittet .
DECLARE ddl_qry VARCHAR2 (150);
I deklarationsafsnittet i vores PL/SQL-blok erklærede vi en variabel med navnet ddl_qry. Denne variabel vil indeholde vores CREATE TABLE DDL, som vi kører ved hjælp af Execute Immediate-sætningen.
Som i den sidste vejledning behandler Execute Immediate alle SQL-sætninger som en streng af VARCHAR2-datatypen. Det er derfor, vi havde erklæret vores variabel ddl_qry som VARCHAR2-datatype.
Udførelsessektionen.
Lige efter deklarationsafsnittet har vi vores henrettelsesafsnit, hvor alt det sjove sker.
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; /
Denne udførelsessektion består kun af to udsagn:
- Opgaveerklæring
- Udfør øjeblikkelig erklæring
Den første erklæring, som er "Assignment Statement", gør denne kode forskellig fra den forrige. Lad os se, hvad disse udsagn er.
Erklæring 1:Opgaveerklæring.
ddl_qry := 'CREATE TABLE tut_83 ('|| 'tut_num NUMBER (5),'|| 'tut_name VARCHAR2 (50),'|| 'CONSTRAINT cons1_col1_pk PRIMARY KEY (tut_num)'|| ')';
Dette er den eneste erklæring, der gør dette PL/SQL-program anderledes end det, vi så i den forrige tutorial.
I denne sætning tildeler vi CREATE TABLE DDL til variablen ddl_qry. Så hvad er anderledes her?
I den forrige metode omsluttede vi hele vores DDL-udsagn i et par enkelte anførselstegn ( ' ' ). Sådan
ddl_qry:= 'CREATE TABLE tut_82 ( tut_num NUMBER(3), tut_name VARCHAR2 (50) )';
Første måde at skrive en DDL-forespørgsel på
Mens vi her i den anden metode i stedet for at pakke hele forespørgslen ind i de enkelte anførselstegn først opdelte den i flere strenge af VARCHAR2. Dette gjorde vi ved at pakke hver enkelt linje i forespørgslen ind i enkelte anførselstegn. Derefter forenede vi dem alle ved at bruge sammenkædet operator ( || ), så PL/SQL-motoren vil udføre dem som en enkelt enhed.
Du kan se en detaljeret demonstration af denne break and conquer-tilgang til dynamisk udførelse i videovejledningen.
Foreslået læsning:Concat-funktion vs Concat-operatør.
Erklæring 2:Udfør øjeblikkelig erklæring.
Vores anden erklæring er Udfør øjeblikkelig erklæring. Den udfører enhver SQL-sætning, der returnerer en enkelt række af resultatet dynamisk. I vores tilfælde udfører denne sætning en CREATE TABLE DDL-forespørgsel gennem en PL/SQL-blok.
Der er kun to måder at udføre en DDL-sætning gennem en PL/SQL-blok i Oracle Database. Enten ved at bruge DBMS_SQL-pakken eller Execute Immediate of Native Dynamic SQL. Læs her for at vide, hvad du ellers kan gøre ved at bruge Execute Immediate.
For at udføre en DDL dynamisk, skal du først skrive den reserverede sætning 'Udfør øjeblikkeligt'. Efterfulgt af variabelnavnet, som du har gemt din DDL i, som vi gjorde ovenfor.
Tjek, om tabellen er oprettet eller ej.
Der er flere måder at kontrollere, om PL/SQL-blokken udførte CREATE TABLE DDL med succes eller ej. Men her vil jeg vise dig de to nemmeste og populære måder.
Brug af kommandoen DESCRIBE
Den nemmeste måde at kontrollere, om PL/SQL-blokken har oprettet tabellen tut_83 med succes eller ej, er ved at bruge DESCRIBE Command. Kommandoen Beskriv viser strukturen af den nævnte tabel, kun hvis den eksisterer ellers returnerer den en fejl.
Lad os prøve det
DESCRIBE tut_83; Or DESC tut_83
Hvis du ved udførelse af ovenstående describe-kommando ser strukturen af tabellen tut_83, betyder det, at ovenstående PL/SQL-blok har oprettet tabellen. Men hvis du får en fejl, betyder det, at du har rodet et sted, og udførelsen af PL/SQL-blokken ikke er vellykket.
Bruger ALL_OBJECTS dataordbog.
Du kan også forespørge på ALL_OBJECTS dataordbog. Dette hjælper med at finde ud af, om den ønskede tabel eller ethvert andet objekt, du forsøger at oprette, er oprettet eller ej. Sådan her
SELECT 'We created a table with name '||object_name||' in ' ||owner||' schema on '||created FROM all_objects WHERE object_name ='TUT_83';
Disse er to blandt mange måder at finde ud af, om det ønskede objekt er oprettet med succes.
En ting mere, før du afslutter denne tutorial. Læs venligst den forrige blog for en bedre forståelse af dette såvel som de kommende tutorials.
Det er PL/SQL tutorial om den anden måde at skrive en CREATE TABLE DDL til Execute Immediate statement af Native Dynamic SQL i Oracle Database.
Håber du nød at læse. Sørg for at abonnere på YouTube-kanalen. For i det næste selvstudie vil vi lære, hvordan man dropper og ændrer skemaobjekter dynamisk.
Tak og god dag!