Oracle PL/SQL-datatyper: Boolean, Antal, Datum [Exempel]

⚡ Smart sammanfattning

PL/SQL-datatyper definierar hur Oracle lagrar, hanterar och begränsar varje värde i ett block. De grupperas i tecken-, tal-, booleska-, datum- och stora objektfamiljer (LOB), var och en med sitt eget lagringsformat, storleksgränser och tilldelningsregler.

  • 🔤 Karaktär: CHAR har fast längd, VARCHAR2 har variabel längd och NCHAR och NVARCHAR2 använder den nationella teckenuppsättningen.
  • 🔢 Nummer: NUMMER lagrar fasta eller flyttalvärden med upp till 38 siffrors precision.
  • Boolean: Innehåller SANT eller FALSKT och används huvudsakligen i villkorlig logik.
  • 📅 Datum: Lagrar datum och tid, standardinställningen är midnatt när ingen tid anges.
  • 🗂️ LOBB: BLOB, CLOB, NCLOB och BFILE lagrar stora ostrukturerade data på upp till 128 TB.
  • ???? Bästa praxis: Föredra VARCHAR2 framför CHAR och LOB framför LONG för att spara minne och vara framtidssäker.
  • 🔗 Omfattning: SQL-typer gäller för tabellkolumner; PL/SQL-typer används inuti PL/SQL-block.

Oracle PL/SQL-datatyper

Vad är PL/SQL-datatyper?

Datatyper i PL/SQL definiera hur data ska lagras, hanteras och behandlas av Oracle under lagring och bearbetning. Datatyper är associerade med ett specifikt lagringsformat och intervallbegränsningar. Oracle, varje värde eller konstant tilldelas en datatyp.

Den största skillnaden mellan PL/SQL och SQL datatyper är att SQL-datatyper är begränsade till tabellkolumner, medan PL/SQL-datatyper används i PL/SQL-block. Mer om detta senare i handledningen.

Följande är ett diagram över de olika Oracle PL/SQL-datatyper:

Olika datatyper i PL/SQL
Olika datatyper i PL/SQL

PL/SQL KARAKTER Datatyp

Den här datatypen lagrar alfanumeriska tecken i strängformat. Literala värden ska alltid omges av enkla citattecken när de tilldelas en CHARACTER-datatyp.

Denna karaktärsdatatyp klassificeras ytterligare enligt följande:

  • CHAR-datatyp (fast strängstorlek)
  • VARCHAR2-datatyp (variabel strängstorlek)
  • VARCHAR-datatyp
  • NCHAR (inbyggd fast strängstorlek)
  • NVARCHAR2 (inbyggd variabel strängstorlek)
  • LÅNGT och LÅNGT RÅT
Data typ BESKRIVNING syntax
RÖDING Den här datatypen lagrar ett strängvärde, och strängens storlek är fast vid deklarationstillfället. variabel.

  • Oracle blank-fyller variabeln om den inte upptar hela den deklarerade storleken, så Oracle allokerar minne för den deklarerade storleken även om variabeln inte fyller den.
  • Storleksbegränsningen är 1-2000 byte.
  • CHAR är mer lämpligt där en fast datastorlek hanteras.
grade CHAR;
manager CHAR (10):= 'guru99';

Syntaxförklaring:

  • Den första satsen deklarerar variabeln 'grade' av CHAR-datatypen med en maximal storlek på 1 byte (standardvärde).
  • Den andra satsen deklarerar variabeln 'manager' av CHAR-datatypen med en maximal storlek på 10 och tilldelar värdet 'guru99', vilket är 6 byte. Oracle allokerar 10 byte istället för 6 i det här fallet.
VARCHAR2 Den här datatypen lagrar en sträng, men längden är inte fast.

  • Storleksbegränsningen är 1–4000 byte för en tabellkolumn och 1–32767 byte för en variabel.
  • Storleken definieras för varje variabel vid deklarationen.
  • Oracle allokerar minne endast efter att variabeln har definierats, så den använder den faktiska längden på den lagrade strängen snarare än den deklarerade storleken.
  • Det är alltid bra att använda VARCHAR2 istället för CHAR för att optimera minnesanvändningen.
manager VARCHAR2(10) := 'guru99';

Syntaxförklaring:

  • Satsen deklarerar variabeln 'manager' av VARCHAR2-datatypen med en maximal storlek på 10 och tilldelar 'guru99', vilket är 6 byte. Oracle allokerar endast minne på 6 byte här.
VARCHAR Detta är synonymt med datatypen VARCHAR2.

  • Det är alltid bra att använda VARCHAR2 istället för VARCHAR för att undvika beteendeförändringar.
manager VARCHAR(10) := 'guru99';

Syntaxförklaring:

  • Satsen deklarerar variabeln 'manager' av VARCHAR-datatypen med en maximal storlek på 10 och tilldelar 'guru99', 6 byte. Oracle allokerar endast 6 byte, liknande VARCHAR2.
NCHAR Denna datatyp är densamma som CHAR, men teckenuppsättningen är den nationella teckenuppsättningen.

  • Denna teckenuppsättning kan definieras för sessionen med NLS_PARAMETERS.
  • Teckenuppsättningen kan vara antingen UTF16 eller UTF8.
  • Storleksbegränsningen är 1-2000 byte.
native NCHAR(10);

Syntaxförklaring:

  • Satsen deklarerar variabeln 'native' av NCHAR-datatypen med en maximal storlek på 10.
  • Längden beror på antalet byte per tecken som definierats i teckenuppsättningen.
NVARCHAR2 Denna datatyp är densamma som VARCHAR2, men teckenuppsättningen är den nationella teckenuppsättningen.

  • Denna teckenuppsättning kan definieras för sessionen med NLS_PARAMETERS.
  • Teckenuppsättningen kan vara antingen UTF16 eller UTF8.
  • Storleksbegränsningen är 1-4000 byte.
Native_var NVARCHAR2(10):= 'guru99';

Syntaxförklaring:

  • Satsen deklarerar variabeln 'Native_var' av datatypen NVARCHAR2 med en maximal storlek på 10.
LÅNGT och LÅNGT RÅT Den här datatypen lagrar stor text eller rådata upp till en maximal storlek på 2 GB.

  • Dessa används främst i dataordboken.
  • LONG lagrar teckenuppsättningsdata, medan LONG RAW lagrar data i binärt format.
  • LONG RAW accepterar medieobjekt och bilder, medan LONG bara fungerar på data som kan lagras med hjälp av en teckenuppsättning.
Large_text LONG;
Large_raw LONG RAW;

Syntaxförklaring:

  • Satsen deklarerar 'Large_text' av datatypen LONG och 'Large_raw' av datatypen LONG RAW.

Obs: Användning av datatypen LONG rekommenderas inte av OracleLOB-datatypen bör föredras istället.

PL/SQL NUMMER Datatyp

Denna datatyp lagrar fasta tal eller flyttal med upp till 38 siffrors precision. Den används för att arbeta med fält som endast innehåller numeriska data. Variabeln kan deklareras antingen med precision och decimalsiffriga detaljer eller utan dem. Värden behöver inte omges av citattecken när de tilldelas.

A NUMBER(8,2);
B NUMBER(8);
C NUMBER;

Syntaxförklaring:

  • Den första deklarationen deklarerar variabeln 'A' av datatypen numerisk med en total precision på 8 och 2 decimalsiffror.
  • Den andra deklarerar 'B' av numerisk datatyp med total precision 8 och inga decimalsiffror.
  • Den tredje är den mest generiska och deklarerar 'C' för taldatatypen utan begränsning av precision eller decimaler. Den kan ta upp till 38 siffror.

PL/SQL BOOLEAN Datatyp

Den här datatypen lagrar logiska värden. Oracle Booleska datatyper representerar antingen SANT eller FALSKT och används huvudsakligen i villkorliga satser. Värden behöver inte omges av citattecken när de tilldelas.

Var1 BOOLEAN;

Syntaxförklaring:

  • Variabeln 'Var1' deklareras som en BOOLESK datatyp. Utdata kommer att vara antingen sant eller falskt baserat på det uppsatta villkoret.

PL/SQL DATUM Datatyp

Denna datatyp lagrar värden i datumformat, som datum, månad och år. När en variabel definieras med datatypen DATE kan den innehålla tidsinformation; som standard är tiden inställd på 12:00:00 om ingen annan anges. Värden måste omges av citattecken när de tilldelas.

Standarden Oracle Tidsformatet för indata och utdata är 'DD-MÅN-ÅÅ', vilket är inställt på NLS_PARAMETERS (NLS_DATE_FORMAT) på sessionsnivå.

newyear DATE:= '01-JAN-2015';
current_date DATE:= SYSDATE;

Syntaxförklaring:

  • Variabeln 'newyear' deklareras som datatypen DATE och tilldelas värdet 1 januari 2015.
  • Den andra deklarationen deklarerar 'current_date' som datatyp DATE och tilldelar det aktuella systemdatumet.
  • Båda variablerna innehåller tidsinformation.

PL/SQL LOB-datatyp

Denna datatyp används huvudsakligen för att lagra och manipulera stora block av ostrukturerad data, såsom bilder och multimediafiler. Oracle föredrar LOB framför datatypen LONG eftersom den är mer flexibel. De främsta fördelarna med LOB jämfört med LONG är:

  • En tabell är begränsad till en LONG-kolumn, medan det inte finns någon begränsning på antalet LOB-kolumner.
  • Datagränssnittsverktyg accepterar LOB under replikering men utelämnar LONG-kolumner, som måste replikeras manuellt.
  • En LONG-kolumn lagrar upp till 2 GB, medan en LOB kan lagra upp till 128 TB.
  • Oracle fortsätter att förbättra LOB-datatypen med varje utgåva, medan LONG i stort sett är oförändrad.

Så det är alltid bra att använda LOB-datatypen istället för LONG. De olika LOB-datatyperna nedan kan lagra upp till 128 terabyte:

  1. KLICK
  2. CLOB och NCLOB
  3. BFIL
Data typ BESKRIVNING syntax
KLICK Den här datatypen lagrar LOB-data i binärt filformat upp till maximalt 128 TB. Den lagrar inte data baserade på teckenuppsättningsdetaljer, så den kan lagra ostrukturerad data som multimediaobjekt och bilder.
Binary_data BLOB;

Syntaxförklaring:

  • Variabeln 'Binary_data' deklareras som en BLOB.
CLOB och NCLOB CLOB lagrar LOB-data i teckenuppsättningen, medan NCLOB lagrar data i den ursprungliga teckenuppsättningen. Eftersom dessa använder teckenuppsättningsbaserad lagring kan de inte lagra data som multimedia eller bilder. Den maximala storleken är 128 TB.
Charac_data CLOB;

Syntaxförklaring:

  • Variabeln 'Charac_data' deklareras som CLOB-datatypen.
BFIL
  • BFILE lagrar ostrukturerad binär data utanför databasen som en operativsystemfil.
  • Storleken på en BFIL begränsas av operativsystemet, och filerna är skrivskyddade och kan inte ändras.

Vanliga frågor

CHAR har fast längd och blank-pads ut till den deklarerade storleken, vilket slösar utrymme på korta värden. VARCHAR2 har variabel längd och lagrar endast de faktiska tecknen, så det är att föredra för de flesta strängkolumner.

LOB tillåter många kolumner per tabell, lagrar upp till 128 TB och förbättrar kontinuerligt varje utgåva. LONG är begränsad till en kolumn, har en gräns på 2 GB och behålls huvudsakligen för bakåtkompatibilitet.

Inte i äldre versioner. BOOLEAN var en typ endast för PL/SQL, så tabellkolumner använde en NUMBER- eller CHAR-flagga istället. Den används direkt inuti block för villkorlig logik.

Ja. Genom att profilera exempelvärden för längd, intervall och format kan AI föreslå VARCHAR2, NUMBER, DATE eller en LOB, och flagga kolumner som är överdimensionerade. Bekräfta valet mot framtida data.

Ja. DATE lagrar århundrade, år, månad, dag, timme, minut och sekund. Om ingen tid anges används midnatt som standard. För bråkdelar av sekunder eller tidszoner, använd TIMESTAMP istället.

Sammanfatta detta inlägg med: