B CHAR versus VARCHAR2 szemantika

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 CHARvá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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.