Skapa tabell-DDL med Execute Immediate
Du måste tänka att vad kan vara problemet med att köra en CREATE TABLE DDL? Okej, inga problem så länge du kör dem med SQL. Men när det gäller att köra dem med PL/SQL så är det lite svårt.
Så först, vad är DDL-satser i Oracle Database?
DDL står för Data Definition Language. Med DDL-satser kan vi skapa eller modifiera databasobjekten såväl som scheman. Dessa uttalanden är:
- SKAPA,
- SLIPPA och
- ÄNDRA.
Det är alltid en god praxis att layouta dina scheman och objekt i förväg och skapa dem i det inledande skedet av ditt projekt. Om möjligt bör vi göra detta arbete med SQL. Det kan vara mycket snabbare och mycket renare. Men ibland är det inte alltid möjligt, i den situationen kan vi ta hjälp av funktioner som Native Dynamic SQL i Oracle Database.
Native Dynamic SQL gör det möjligt för oss att köra SQL-satser som DDL eller DML rakt igenom vår PL/SQL.
Varför kan vi inte köra DDL genom ett PL/SQL-program?
Om du fortfarande undrar om det är så komplicerat att köra DDL-sats med PL/SQL, låt oss försöka skapa en tabell genom ett PL/SQL-program.
SET SERVEROUTPUT ON; BEGIN CREATE TABLE tut_82 ( tut_num NUMBER(3), tut_name VARCHAR2 (50)); END; /
Jag vet att detta tillvägagångssätt skulle ha varit din första tanke om jag hade bett dig att skapa en tabell genom ett PL/SQL-program. Jag menar, det här ser perfekt ut, vad kan gå fel?
Det är inget fel på det här programmet, det enda problemet här är att PL/SQL inte direkt stöder DDL-satser. För att exekvera en DDL-sats med PL/SQL måste vi antingen ta hjälp av paketet DBMS_SQL eller det avancerade och förbättrade sättet med NATIVE DYNAMIC SQL.
Du kan kolla upp detta själv. Gå vidare och kör ovanstående program. Vid körning kommer du att få ett felmeddelande som ser ut ungefär som det som visas på bilden nedan.
Så, vad är det korrekta sättet att köra ett DDL genom PL/SQL-program?
Du kan köra ett DDL genom PL/SQL-program antingen genom att använda paketet DBMS_SQL eller genom att använda Execute Immediate-satsen för Native Dynamic SQL. Det sistnämnda alternativet är det mest använda, speciellt nu för tiden på grund av dess bättre prestanda och lättlästa syntax.
Hur kör man CREATE TABLE DDL med Execute Immediate i Oracle Database?
Steg 1:Förbered din DDL i förväg.
Även om det inte är nödvändigt, men jag föreslår att du förbereder din DDL i förväg, på så sätt kan du åtminstone eliminera chanserna att få syntaktiska fel på grund av syntaxen i din DDL-sats.
I vårt fall vill vi köra en CREATE TABLE DDL så låt oss först skriva en DDL för att skapa en tabell.
CREATE TABLE tut_82 ( tut_num NUMBER (3), tut_name VARCHAR2 (50) )
Denna DDL-sats kommer att skapa en tabell med namnet tut_82 med två kolumner tut_num av NUMBER datatyp och tut_name av datatypen VARCHAR2.
Tänk här, avsluta inte din SQL-sats (den som du vill köra med EXECUTE IMMEDIATE) med ett semikolon.
Steg 2:Kör din DDL genom PL/SQL-programmet med Execute Immediate.
När du har förberett din DDL härnäst måste du skriva ditt PL/SQL-program.
SET SERVEROUTPUT ON; DECLARE ddl_qry VARCHAR2 (150); BEGIN ddl_qry := 'CREATE TABLE tut_82( tut_num NUMBER(3), tut_name VARCHAR2(50) )'; EXECUTE IMMEDIATE ddl_qry; END; /
I ovanstående PL/SQL-block deklarerade vi en variabel med namnet ddl_qry. Vi använde denna variabel för att hålla vår DDL-sats som vi förberedde i steg 1.
Information:
En sak som du måste se till här är att variabeln som du kommer att använda för att hålla SQL-satsen som du vill köra med din EXECUTE IMMEDIATE-sats alltid måste vara av VARCHAR2-datatyp och har mycket databredd så att din DDL lätt kan passa in i den.
I exekveringssektionen av detta PL/SQL-block har vi två exekverbara satser. Dessa uttalanden är:
Uttalande 1:Uppdragsförklaring
I den första satsen har vi lagrat vår Skapa tabell DDL i variabeln ddl_qry med tilldelningsoperatorn (I PL/SQL är tilldelningsoperatorn kombinationen av kolon och lika med tecken).
Uttalande 2:The Mighty Execute Immediate uttalande
Det andra uttalandet är Execute Statementet. För att exekvera 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.
Om du vill kan du också skriva din DDL direkt efter frasen "Reserved Phrase". Det är helt och hållet ett personligt val. Jag gillar att använda det tidigare tillvägagångssättet där vi använder Variable för att hålla DDL eftersom det först och främst gör att din kod ser snygg och ren ut och dessutom gör det felspårningen mycket enklare.
Men Manish, jag vill lära mig det andra sättet att skriva DDL-satsen också.
Visst, det är inget fel i att lära sig något nytt.
BEGIN EXECUTE IMMEDIATE 'CREATE TABLE tut_82( tut_num NUMBER(3), tut_name VARCHAR2(50) )'; END; /
Det alternativa tillvägagångssättet till ovanstående kod är att skriva DDL-satsen direkt i din Execute Immediate-sats. För detta behöver du bara först skriva den reserverade frasen Execute Immediate följt av DDL-satsen som du vill köra dynamiskt.
På något av sätten behöver du bara ta hand om några saker medan du skriver DDL för Execute Immediate.
För det första:Bifoga alltid din SQL-sats i ett par enkla citattecken
Kom alltid ihåg att Execute Immediate behandlar DDL eller DML eller andra SQL-satser som stöds som du vill köra dynamiskt som en sträng av VARCHAR2-datatypen och i PL/SQL omsluter vi alla tecken eller VARCHAR2-strängar i ett par enkla citattecken. Se därför alltid till att bifoga din SQL-sats som du vill köra med Execute Immediate i ett par enkla citattecken.
Andra:Ta hand om semikolon.
Om du skriver en SQL-sats för Execute Immediate måste du sätta semikolon (;) precis utanför de enstaka citattecken som du har lagt in din SQL-sats i. Å andra sidan om du skriver ett PL/SQL-block för dynamisk exekvering med Execute Immediate måste du sätta semikolon i slutet av ditt PL/SQL-block precis före det avslutande enstaka citatet såväl som precis utanför de avslutande enstaka citattecken.
Det är den detaljerade handledningen om hur man kör Create Table DDL-satsen med EXECUTE IMMEDIATE-satsen för Native Dynamic SQL i Oracle Database. Hoppas du gillade det och lärde dig något nytt.
Se till att prenumerera på min YouTube-kanal eftersom i nästa handledning kommer vi att lära oss något nytt och intressant om Dynamic SQL. Du kan också följa mig på min Twitter och Facebook.
Tack och ha en bra dag!