Oracle PL/SQL Indsæt, opdater, slet og vælg i [Eksempel]

⚡ Smart opsummering

SQL-sætninger indeni Oracle PL/SQL håndterer alle datamanipulationsopgaver og lader en blok indsætte, opdatere, slette og vælge rækker direkte. Kommandoerne INSERT, UPDATE, DELETE og SELECT INTO flytter og henter data i databasen.

  • 🇧🇷 DML-kommandoer: INSERT, UPDATE, DELETE og SELECT INTO udfører alle datamanipulationsopgaver i en PL/SQL-blok.
  • ➕ Dataindsættelse: INSERT INTO tilføjer rækker fra eksplicitte VALUES eller direkte fra en anden tabel ved hjælp af en SELECT.
  • 🔄 Dataopdatering: UPDATE med SET ændrer kolonneværdier, mens en valgfri WHERE-klausul begrænser de berørte rækker.
  • 🗑️ Datasletning: DELETE fjerner matchende poster, og udeladelse af WHERE-klausulen rydder hele tabellen.
  • 🎯 Vælg ind i: SELECT INTO skal returnere præcis én række, eller Oracle hæver NO_DATA_FOUND eller TOO_MANY_ROWS.
  • 🤖 AI Assistance: AI-assistenter som GitHub Copilot udarbejder DML-blokke og markerer manglende WHERE- eller COMMIT-filer.

Oracle PL/SQL Indsæt Opdater Slet Vælg Ind i

DML-transaktioner i PL/SQL

DML står for Data Manipulation Language, gruppen af SQL kommandoer, der ændrer dataene gemt i en tabel. Inden for en PL/SQL-blok, disse kommandoer udfører manipulationsarbejdet, mens PL/SQL leverer den omgivende logik. DML håndterer nedenstående operationer.

  • Dataindsættelse
  • Dataopdatering
  • Datasletning
  • Datavalg

I PL/SQL udføres datamanipulation kun via SQL-kommandoer.

Dataindsættelse

I PL/SQL tilføjes rækker til en tabel med SQL-kommandoen INSERT INTO. Denne kommando tager tabelnavnet, målkolonnerne og kolonneværdierne som input og indsætter derefter værdien i basistabellen.

INSERT-kommandoen kan også tage værdierne direkte fra en anden tabel ved hjælp af en SELECT-sætning i stedet for at angive værdierne for hver kolonne. Med en SELECT-sætning kan der indsættes lige så mange rækker på én gang, som kildetabellen indeholder.

Syntaks:

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

Ovenstående syntaks viser INSERT INTO-kommandoen. Tabelnavnet og værdierne er obligatoriske felter, hvorimod kolonnenavne er valgfrie, når INSERT-sætningen angiver værdier for hver kolonne i tabellen. Nøgleordet VALUES er obligatorisk, når værdierne angives separat, som vist ovenfor.

Syntaks:

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

Denne anden form for INSERT INTO tager værdierne direkte fra ved hjælp af SELECT-kommandoen. Nøgleordet VALUES må ikke være til stede her, da værdierne ikke angives separat.

Dataopdatering

Dataopdatering betyder at ændre værdien af ​​en kolonne i en eksisterende række. Dette gøres med UPDATE-sætningen, som tager tabelnavnet, kolonnenavnet og den nye værdi som input og opdaterer dataene.

Syntaks:

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;

Ovenstående syntaks viser UPDATE-sætningen. Nøgleordet SET instruerer PL/SQL-motoren i at opdatere kolonnen med den angivne værdi. WHERE-klausulen er valgfri; hvis den ikke er angivet, opdateres værdien af ​​den nævnte kolonne i hele tabellen.

Datasletning

Datasletning betyder at fjerne en hel post fra databasetabellen. DELETE-kommandoen bruges til dette formål.

Syntaks:

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

Ovenstående syntaks viser DELETE-kommandoen. Nøgleordet FROM er valgfrit, og med eller uden FROM-klausulen opfører kommandoen sig på samme måde. WHERE-klausulen er valgfri; hvis den ikke er angivet, vil hele tabellen blive tømt.

Datavalg

Dataprojektion, eller hentning, betyder at hente de nødvendige data fra databasetabellen. Dette opnås med SELECT-kommandoen sammen med INTO-klausulen. SELECT-kommandoen henter værdierne fra databasen, og INTO-klausulen tildeler disse værdier til de lokale variabler i PL/SQL-blokken.

Følgende punkter skal overvejes, når du bruger en SELECT-sætning med INTO:

  • En SELECT-sætning bør kun returnere én post, når INTO-klausulen bruges, fordi én variabel kun kan indeholde én værdi. Hvis SELECT returnerer mere end én række, TOO_MANY_ROWS undtagelse er rejst.
  • SELECT-sætningen tildeler værdien til variablen i INTO-klausulen, så den skal bruge mindst én post for at udfylde værdien. Hvis den ikke finder nogen post, genereres undtagelsen NO_DATA_FOUND.
  • Antallet af kolonner og deres datatyper i SELECT-klausulen skal stemme overens med antallet af variabler og deres datatyper i INTO-klausulen.
  • Værdierne hentes og udfyldes i samme rækkefølge som nævnt i erklæringen.
  • WHERE-klausulen er valgfri og giver dig mulighed for at sætte flere begrænsninger på de poster, der hentes.
  • En SELECT-sætning kan bruges i WHERE-betingelsen i andre DML-sætninger til at definere værdierne for betingelserne.
  • En SELECT-sætning, der bruges i INSERT-, UPDATE- eller DELETE-sætninger, bør ikke have en INTO-klausul, da den i disse tilfælde ikke udfylder nogen variable.

Syntaks:

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

Ovenstående syntaks viser SELECT-INTO-kommandoen. Nøgleordet FROM er obligatorisk og identificerer den tabel, hvorfra dataene skal hentes. WHERE-klausulen er valgfri; hvis den ikke er angivet, hentes data fra hele tabellen.

Eksempel 1: I dette eksempel vil vi se, hvordan man udfører DML-operationer i PL/SQL. Vi indsætter de fire poster nedenfor i emp-tabellen.

EMP_NAME EMP_NO LØN MANAGER
BBB 1000 25000 AAA
XXX 1001 10000 BBB
yyy 1002 10000 BBB
ZZZ 1003 7500 BBB

Derefter opdaterer vi lønnen for 'XXX' til 15000, sletter medarbejderposten 'ZZZ' og projicerer endelig detaljerne for medarbejderen 'XXX'.

Skærmbilledet nedenfor viser den komplette PL/SQL-blok, der blev brugt i dette eksempel.

Oracle PL/SQL-blok udfører indsættelse, opdatering, sletning og vælg ind i 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;
/

Output:

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

Code Forklaring:

  • Code linje 2-5: Deklarering af variablerne.
  • Code linje 7-14: Indsættelse af poster i emp-tabellen.
  • Code linje 15: Bekræfter indsættelsestransaktionerne.
  • Code linje 17-19: Opdaterer medarbejderens løn 'XXX' til 15000.
  • Code linje 20: Udfører opdateringstransaktionen.
  • Code linje 22: Sletter posten 'ZZZ'.
  • Code linje 23: Udfører slettetransaktionen.
  • Code linje 25: Valg af posten 'XXX' og udfyldning af variablerne l_emp_name, l_emp_no, l_salary og l_manager.
  • Code linje 26-30: Viser de hentede postværdier.

Ofte Stillede Spørgsmål

Nej. Statisk PL/SQL kan ikke køre DDL direkte. Byg sætningen som en streng og udfør den med KØRE UMIDLIGT, som håndterer CREATE, ALTER og DROP under kørsel.

En SELECT INTO skal returnere præcis én række. For at læse mange rækker skal du bruge en eksplicit markøren med en FETCH-løkke eller BULK COLLECT IND I en samling.

DELETE er DML: den fjerner markerede rækker med en WHERE-klausul og kan rulles tilbage. TRUNCATE er DDL: den rydder alle rækker øjeblikkeligt, foretager automatisk commit og kan ikke fortrydes.

Ja. Ændringer af typen INDSÆT, OPDATER og SLET forbliver i din session, indtil du COMMITPL/SQL udfører ikke automatisk commit. Brug COMMIT til at gemme eller ROLLBACK til at kassere.

MERGE udfører en upsert — den opdaterer rækker, der matcher en join-betingelse, og indsætter dem, der ikke gør — i en enkelt sætning i stedet for separate UPDATE- og INSERT-gennemløb.

RETURNING INTO indfanger kolonneværdier fra de rækker, som en INSERT, UPDATE eller DELETE netop har påvirket, og gemmer dem i variabler, hvilket undgår en ekstra SELECT for at læse de ændrede data.

Ja. GitHub Copilot laver kladder til INSERT-, UPDATE-, DELETE- og SELECT INTO-blokke fra en kort kommentar, foreslår bindingsvariabler og fuldfører kolonnelister, selvom du bør gennemgå logikken først.

AI-assistenter scanner DML for manglende WHERE-klausuler, manglende COMMIT'er og usikker sammenkædning, og foreslår derefter rettelser og forklarer fejl. Denne maskinlæringsgennemgang fanger risikable ændringer, før de når produktion.

Opsummer dette indlæg med: