Oracle PL/SQL Infoga, Uppdatera, Ta bort och välj i [Exempel]

⚡ Smart sammanfattning

SQL-satser inuti Oracle PL/SQL hanterar alla datamanipulationsuppgifter och låter ett block infoga, uppdatera, ta bort och välja rader direkt. Kommandona INSERT, UPDATE, DELETE och SELECT INTO flyttar och hämtar data inom databasen.

  • ⚙️ DML-kommandon: INSERT, UPDATE, DELETE och SELECT INTO utför alla datamanipulationsuppgifter i ett PL/SQL-block.
  • Datainsättning: INSERT INTO lägger till rader från explicita VÄRDEN eller direkt från en annan tabell med hjälp av en SELECT.
  • 🔄 Datauppdatering: UPDATE med SET ändrar kolumnvärden, medan en valfri WHERE-klausul begränsar de berörda raderna.
  • 🗑️ Radering av data: DELETE tar bort matchande poster, och om WHERE-klausulen utelämnas rensas hela tabellen.
  • 🎯 Välj in i: SELECT INTO måste returnera exakt en rad, eller Oracle höjer NO_DATA_FOUND eller TOO_MANY_ROWS.
  • 🤖 AI-hjälp: AI-assistenter som GitHub Copilot utarbetar DML-block och flaggar en saknad WHERE eller COMMIT.

Oracle PL/SQL Infoga Uppdatera Ta bort Markera In i

DML-transaktioner i PL/SQL

DML står för Data Manipulation Language, gruppen av SQL kommandon som ändrar data som lagras i en tabell. Inom en PL/SQL-block, dessa kommandon utför manipulationsarbetet, medan PL/SQL tillhandahåller den omgivande logiken. DML hanterar operationerna nedan.

  • Datainsättning
  • Uppdatering av data
  • Radering av data
  • Dataval

I PL/SQL utförs datamanipulation endast via SQL-kommandon.

Datainsättning

I PL/SQL läggs rader till i en tabell med SQL-kommandot INSERT INTO. Detta kommando tar tabellnamnet, målkolumnerna och kolumnvärdena som indata och infogar sedan värdet i bastabellen.

INSERT-kommandot kan också hämta värdena direkt från en annan tabell med hjälp av ett SELECT-uttryck istället för att ange värdena för varje kolumn. Genom ett SELECT-uttryck kan så många rader som källtabellen innehåller infogas samtidigt.

Syntax:

BEGIN
INSERT INTO <table_name>(<column1>,<column2>,...,<column_n>)
VALUES(<value1>,<value2>,...,<value_n>);
END;

Syntaxen ovan visar INSERT INTO-kommandot. Tabellnamnet och värdena är obligatoriska fält, medan kolumnnamnen är valfria när INSERT-satsen anger värden för varje kolumn i tabellen. Nyckelordet VALUES är obligatoriskt när värdena anges separat, som visas ovan.

Syntax:

BEGIN
INSERT INTO <table_name>(<column1>,<column2>,...,<column_n>)
SELECT <column1>,<column2>,...,<column_n> FROM <table_name2>;
END;

Denna andra form av INSERT INTO tar värdena direkt från med hjälp av SELECT-kommandot. Nyckelordet VALUES får inte finnas här eftersom värdena inte anges separat.

Uppdatering av data

Datauppdatering innebär att ändra värdet på en kolumn i en befintlig rad. Detta görs med UPDATE-satsen, som tar tabellnamnet, kolumnnamnet och det nya värdet som indata och uppdaterar informationen.

Syntax:

BEGIN
UPDATE <table_name>
SET <column1>=<value1>,<column2>=<value2>,<column_n>=<value_n>
WHERE <condition that uniquely identifies the record that needs to be updated>;
END;

Syntaxen ovan visar UPDATE-satsen. Nyckelordet SET instruerar PL/SQL-motorn att uppdatera kolumnen med det angivna värdet. WHERE-satsen är valfri; om den inte anges uppdateras värdet för den nämnda kolumnen i hela tabellen.

Radering av data

Dataradering innebär att ta bort en hel post från databastabellen. DELETE-kommandot används för detta ändamål.

Syntax:

BEGIN
DELETE FROM <table_name>
WHERE <condition that uniquely identifies the record that needs to be deleted>;
END;

Syntaxen ovan visar DELETE-kommandot. Nyckelordet FROM är valfritt, och med eller utan FROM-klausulen beter sig kommandot på samma sätt. WHERE-klausulen är valfri; om den inte anges kommer hela tabellen att tömmas.

Dataval

Dataprojektion, eller hämtning, innebär att hämta nödvändig data från databastabellen. Detta uppnås med SELECT-kommandot tillsammans med INTO-klausulen. SELECT-kommandot hämtar värdena från databasen, och INTO-klausulen tilldelar dessa värden till de lokala variablerna i PL/SQL-blocket.

Följande punkter måste beaktas när du använder en SELECT-sats med INTO:

  • En SELECT-sats ska endast returnera en post när INTO-satsen används, eftersom en variabel bara kan innehålla ett värde. Om SELECT returnerar mer än en rad, TOO_MANY_ROWS undantag höjs.
  • SELECT-satsen tilldelar värdet till variabeln i INTO-satsen, så den behöver minst en post för att fylla i värdet. Om den inte hittar någon post utlöses undantaget NO_DATA_FOUND.
  • Antalet kolumner och deras datatyper i SELECT-klausulen ska matcha antalet variabler och deras datatyper i INTO-klausulen.
  • Värdena hämtas och fylls i i samma ordning som nämns i uttalandet.
  • WHERE-klausulen är valfri och låter dig sätta fler begränsningar för de poster som hämtas.
  • En SELECT-sats kan användas i WHERE-villkoret för andra DML-satser för att definiera värdena för villkoren.
  • En SELECT-sats som används inuti INSERT-, UPDATE- eller DELETE-satser bör inte ha en INTO-sats, eftersom den i dessa fall inte fyller i någon variabel.

Syntax:

BEGIN
SELECT <column1>,...,<column_n> INTO <variable1>,...,<variable_n>
FROM <table_name>
WHERE <condition to fetch the required records>;
END;

Syntaxen ovan visar SELECT-INTO-kommandot. Nyckelordet FROM är obligatoriskt och identifierar tabellen från vilken data ska hämtas. WHERE-klausulen är valfri; om den inte anges kommer data från hela tabellen att hämtas.

Exempel 1: I det här exemplet ska vi se hur man utför DML-operationer i PL/SQL. Vi kommer att infoga de fyra posterna nedan i tabellen emp.

EMP_NAME EMP_NO LÖN CHEF
BBB 1000 25000 AAA
XXX 1001 10000 BBB
ÅÅÅÅ 1002 10000 BBB
ZZZ 1003 7500 BBB

Sedan uppdaterar vi lönen för 'XXX' till 15000, tar bort medarbetarposten 'ZZZ' och projicerar slutligen detaljerna för medarbetaren 'XXX'.

Skärmdumpen nedan visar det kompletta PL/SQL-blocket som används i det här exemplet.

Oracle PL/SQL-block som utför insert, update, delete och select into på emp-tabellen

DECLARE
l_emp_name VARCHAR2(250);
l_emp_no NUMBER;
l_salary NUMBER;
l_manager VARCHAR2(250);
BEGIN
INSERT INTO emp(emp_name,emp_no,salary,manager)
VALUES('BBB',1000,25000,'AAA');
INSERT INTO emp(emp_name,emp_no,salary,manager)
VALUES('XXX',1001,10000,'BBB');
INSERT INTO emp(emp_name,emp_no,salary,manager)
VALUES('YYY',1002,10000,'BBB');
INSERT INTO emp(emp_name,emp_no,salary,manager)
VALUES('ZZZ',1003,7500,'BBB');
COMMIT;
Dbms_output.put_line('Values Inserted');
UPDATE EMP
SET salary=15000
WHERE emp_name='XXX';
COMMIT;
Dbms_output.put_line('Values Updated');
DELETE emp WHERE emp_name='ZZZ';
COMMIT;
Dbms_output.put_line('Values Deleted');
SELECT emp_name,emp_no,salary,manager INTO l_emp_name,l_emp_no,l_salary,l_manager FROM emp WHERE emp_name='XXX';
Dbms_output.put_line('Employee Detail');
Dbms_output.put_line('Employee Name:'||l_emp_name);
Dbms_output.put_line('Employee Number:'||l_emp_no);
Dbms_output.put_line('Employee Salary:'||l_salary);
Dbms_output.put_line('Employee Manager Name:'||l_manager);
END;
/

Produktion:

Values Inserted
Values Updated
Values Deleted
Employee Detail
Employee Name:XXX
Employee Number:1001
Employee Salary:15000
Employee Manager Name:BBB

Code Förklaring:

  • Code rad 2-5: Deklarera variablerna.
  • Code rad 7-14: Infogar posterna i emp-tabellen.
  • Code rad 15: Verkställer infogningstransaktionerna.
  • Code rad 17-19: Uppdaterar lönen för medarbetaren 'XXX' till 15 000.
  • Code rad 20: Utför uppdateringstransaktionen.
  • Code rad 22: Tar bort posten 'ZZZ'.
  • Code rad 23: Verkställer borttagningstransaktionen.
  • Code rad 25: Markera posten 'XXX' och fyll i variablerna l_emp_name, l_emp_no, l_salary och l_manager.
  • Code rad 26-30: Visar de hämtade postvärdena.

Vanliga frågor

Nej. Statisk PL/SQL kan inte köra DDL direkt. Bygg kommandot som en sträng och kör det med KÖR OMEDELBART, som hanterar CREATE, ALTER och DROP vid körning.

En SELECT INTO måste returnera exakt en rad. För att läsa många rader, använd en explicit markören med en FETCH-loop, eller BULK COLLECT INTO en samling.

DELETE är DML: den tar bort markerade rader med en WHERE-klausul och kan rullas tillbaka. TRUNCATE är DDL: den rensar varje rad direkt, autocommitar och kan inte ångras.

Ja. Ändringar av INSERT, UPDATE och DELETE sparas i din session tills du BEGÅPL/SQL utför inte automatisk commit. Använd COMMIT för att spara eller ROLLBACK för att ignorera.

MERGE utför en upsert – den uppdaterar rader som matchar ett kopplingsvillkor och infogar de som inte gör det – i en enda sats istället för separata UPDATE- och INSERT-pass.

RETURNING INTO hämtar kolumnvärden från de rader som just påverkats av en INSERT, UPDATE eller DELETE och lagrar dem i variabler, vilket undviker en extra SELECT för att läsa den ändrade informationen.

Ja. GitHub Copilot skapar utkast till INSERT-, UPDATE-, DELETE- och SELECT INTO-block från en kort kommentar, föreslår bindningsvariabler och kompletterar kolumnlistor, men du bör granska logiken först.

AI-assistenter skannar DML efter saknade WHERE-klausuler, frånvarande COMMIT-klausuler och osäker sammanfogning, och föreslår sedan korrigeringar och förklarar fel. Denna maskininlärningsgranskning upptäcker riskfyllda förändringar innan de når produktion.

Sammanfatta detta inlägg med: