Ez a függelék ismerteti a CHAR
és VARCHAR2
alaptípusok közötti szemantikai különbségeket. Ezek a finom, de fontos különbségek a karakterértékek hozzárendelésekor, összehasonlításakor, beszúrásakor, frissítésekor, kiválasztásakor vagy lekérésekor jönnek létre.
Ez a függelék a következő témákat tárgyalja:
Karakterértékek hozzárendelése Karakterértékek összehasonlítása Karakterértékek beszúrása karakterértékek kiválasztása
Karakterértékek hozzárendelése
ha karakterértéket rendel egy CHAR
változóhoz, ha az érték rövidebb, mint a változó deklarált hossza, PL/SQL blank-pads az értéket a deklarált hosszra. Tehát elvész a záró üresekkel kapcsolatos információ. A következő példában a last_name
értékhez rendelt érték hat záró üres részt tartalmaz, nem csak egyet:
last_name CHAR(10) := 'CHEN '; -- note trailing blank
Ha a karakterérték hosszabb, mint a CHAR
változó deklarált hossza, a PL/SQL megszakítja a hozzárendelést, és felveti az előre meghatározott kivételt VALUE_ERROR
. PL / SQL sem csonkolja az értéket, sem megpróbálja levágni a záró üres részeket. Például, mivel a nyilatkozat
acronym CHAR(4);
a következő hozzárendelés felveti VALUE_ERROR
:
acronym := 'SPCA '; -- note trailing blank
amikor karakterértéket rendel egy VARCHAR2
változóhoz, ha az érték rövidebb, mint a változó deklarált hossza, a PL/SQL sem az üres lapokat, sem az üres helyeket nem törli. A karakterértékek sértetlenek, így nem vesznek el információ. Ha a karakterérték hosszabb, mint a VARCHAR2
változó deklarált hossza, a PL/SQL megszakítja a hozzárendelést, és emeli a VALUE_ERROR
értéket. PL / SQL sem csonkolja az értéket, sem megpróbálja levágni a záró üres részeket.
Karakterértékek összehasonlítása
a relációs operátorok segítségével összehasonlíthatja a karakterértékeket az egyenlőség vagy az egyenlőtlenség szempontjából. Az összehasonlítások az adatbázis karakterkészletéhez használt válogatási sorrenden alapulnak. Az egyik karakterérték nagyobb, mint a másik, ha azt követi az összevetési sorrendben. Például, mivel a deklarációk
last_name1 VARCHAR2(10) := 'COLES';last_name2 VARCHAR2(10) := 'COLEMAN';
a következő, ha a feltétel igaz:
IF last_name1 > last_name2 THEN ...
az ANSI/ISO SQL megköveteli, hogy két összehasonlított karakterérték azonos hosszúságú legyen. Tehát, ha az összehasonlításban mindkét érték adattípusa CHAR
, akkor üres kitöltési szemantikát használunk. Vagyis az egyenlőtlen hosszúságú karakterértékek összehasonlítása előtt PL/SQL üres-a rövidebb értéket a hosszabb érték hosszához illeszti. Például, mivel a deklarációk
last_name1 CHAR(5) := 'BELLO';last_name2 CHAR(10) := 'BELLO '; -- note trailing blanks
a következő IF
feltétel igaz:
IF last_name1 = last_name2 THEN ...
Ha az összehasonlítás bármelyik értéke adattípussal rendelkezik VARCHAR2
, nem üres párnázó szemantikát használnak. Ez azt jelenti, hogy az egyenlőtlen hosszúságú karakterértékek összehasonlításakor a PL/SQL nem módosítja a pontos hosszúságokat. Például, mivel a deklarációk
last_name1 VARCHAR2(10) := 'DOW';last_name2 VARCHAR2(10) := 'DOW '; -- note trailing blanks
a következő IF
feltétel hamis:
IF last_name1 = last_name2 THEN ...
Ha az összehasonlítás egyik értéke adattípussal rendelkezik VARCHAR2
és a másik érték adattípusa CHAR
, nem üres kitöltésű szemantikát használnak. De ne feledje, hogy amikor karakterértéket rendel egy CHAR
változóhoz, ha az érték rövidebb, mint a változó deklarált hossza, PL/SQL blank-pads az értéket a deklarált hosszra. Tehát, mivel a nyilatkozatok
last_name1 VARCHAR2(10) := 'STAUB';last_name2 CHAR(10) := 'STAUB'; -- PL/SQL blank-pads value
a következő IF
feltétel hamis, mert az értéke last_name2
öt záró üres:
IF last_name1 = last_name2 THEN ...
All a karakterlánc literálok adattípusa CHAR
. Tehát, ha az összehasonlítás mindkét értéke literál, akkor üres párnázó szemantikát használunk. Ha az egyik érték szó szerinti, az üres kitöltési szemantikát csak akkor használjuk, ha a másik érték adattípusa CHAR
.
Karakterértékek beszúrása
amikor PL/SQL karakterváltozót szúr be egy Oracle adatbázis oszlopba, az, hogy az érték üres-e vagy sem, az oszlop típusától függ, nem pedig a változó típusától.
amikor egy karakterértéket beszúr egy CHAR
adatbázis oszlopba, az Oracle nem távolítja el a záró üres részeket. Ha az érték rövidebb, mint az oszlop meghatározott szélessége, az Oracle blank-az értéket a meghatározott szélességre helyezi. Ennek eredményeként elvész a hátsó üresekkel kapcsolatos információ. Ha a karakterérték hosszabb, mint az oszlop meghatározott szélessége, az Oracle megszakítja a beszúrást, és hibát generál.
amikor egy karakterértéket beszúr egy VARCHAR2
adatbázis oszlopba, az Oracle nem távolítja el a záró üres részeket. Ha az érték rövidebb, mint az oszlop meghatározott szélessége, az Oracle nem üríti ki az értéket. A karakterértékek sértetlenül tárolódnak, így semmilyen információ nem vész el. Ha a karakterérték hosszabb, mint az oszlop meghatározott szélessége, az Oracle megszakítja a beszúrást, és hibát generál.
Megjegyzés: ugyanezek a szabályok vonatkoznak a frissítésre.
karakterértékek beszúrásakor, annak érdekében, hogy ne tároljanak záró üres részeket, használja a RTRIM
funkciót, amely a záró üres részeket vágja le. Egy példa következik:
DECLARE ... my_name VARCHAR2(15);BEGIN ... my_ename := 'LEE '; -- note trailing blanks INSERT INTO emp VALUES (my_empno, RTRIM(my_ename), ...); -- inserts 'LEE'END;
Karakterértékek kiválasztása
Ha egy Oracle adatbázis oszlopból PL/SQL karakterváltozóba választ ki egy értéket, az, hogy az érték üres-e vagy sem, a változó típusától függ, nem pedig az oszlop típusától.
amikor kiválaszt egy oszlopértéket egy CHAR
változóba, ha az érték rövidebb, mint a változó deklarált hossza, PL/SQL blank-pads az értéket a deklarált hosszra. Ennek eredményeként elvész a hátsó üresekkel kapcsolatos információ. Ha a karakterérték hosszabb, mint a változó deklarált hossza, a PL/SQL megszakítja a hozzárendelést, és emeli a VALUE_ERROR
értéket.
amikor kiválaszt egy oszlopértéket egy VARCHAR2
változóba, ha az érték rövidebb, mint a változó deklarált hossza, a PL/SQL sem az üres lapokat, sem az üres helyeket nem törli. A karakterértékek sértetlenül tárolódnak, így semmilyen információ nem vész el.
ha például egy üresen kitöltött CHAR
oszlopértéket választ ki egy VARCHAR2
változóba, a záró üres elemek nem lesznek eltávolítva. Ha a karakterérték hosszabb, mint a VARCHAR2
változó deklarált hossza, a PL/SQL megszakítja a hozzárendelést, és emeli a VALUE_ERROR
értéket.
Megjegyzés: ugyanezek a szabályok érvényesek a lekéréskor is.