Par objektu (ne)nosaukumiem

Nesen boot forumā bija kārtējais jautājums – vai var izveidot tabulu kolonu nosaukumus izmantojot ciparus. Vismaz man zināmajās var gan, tikai problēma ir mazliet cita – tā rezultātā mēs veidojam objektu nosaukumus, ar kuriem var ļoti viegli kļūdīties. Padomājiet paši – ja kolonas nosaukums ir skaitlis, cik grūti ir vienai kolonai pieskaitīt nevis otru kolonu, kuras nosaukums ir “2”, bet vienkārši skaitli 2? Otra lieta – vienmēr jāatceras, ka kolonas nosaukums jāliek pēdiņās (Oracle) vai apostrofos (MySQL), vai iespējams vēl kādos citos specsimbolos, savukārt, ja ir ielikts, tad atkal lasot kodu ir ļoti viegli palaist garām to, ka tā ir kolona, nevis vienkārši skaitlis 2.

Nu lūk domājot par šīm jaukajām iespējām, ka SQLā izmantot dažādas iespējas kā sabojāt gan savu, gan nākošo koda uzturētāju dzīvi, nāk prātā dažas iespējas, ar kurām gribējās padalīties publiski. Piemēri Oraclē, bet līdzīgas tehnikas noteikti var izmantot arī citur.

Mēs varam izveidot tabulas ar identiskiem nosaukumiem, tikai vienu lielajiem, vienu mazajiem burtiem:

SQL> create table A (lielais number);
Table created.
SQL> create table "a" (mazais number);
Table created.

Pētam kāda tad nu izskatā tabula A un tabula a:

SQL> desc A
 Name                                      Null?    Type
 ----------------------------------------- -------- -------
 LIELAIS                                            NUMBER
SQL> desc a
 Name                                      Null?    Type
 ----------------------------------------- -------- -------
 LIELAIS                                            NUMBER

Hmmm, kaut kā dīvaini, vai ne? Tas tāpēc, ka Oracle noklusēti visus nenopēdiņotus objektu identifikatorus pārveido uz lielajiem burtiem. Lai tiktu pie tabulas a, mums nosaukums jāraksta pēdiņās:

SQL> desc "a"
 Name                                      Null?    Type
 ----------------------------------------- -------- -------
 MAZAIS                                             NUMBER

Bet tas ir tikai priekš pirmziemniekiem. Krutāki džeki varētu spert soli tālāk un izveidot piemēram tabulas nosaukumu, kā tukšuma simbolu (space). Tad meklējot tabulu nosaukumus shēmā, cilvēkus ar vājākiem nerviem var viegli novest pie pārliecības, ka nupat ir iegūta nopietna Oracles kļūda – 3 ieraksti atlasīti, bet rāda tikai divus :O

SQL> create table " " (A number, "a" number);
Table created.
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
a

A
3 rows selected.

Bet nekas, arī tas vēl nav viss. Vai tad mums būtu jāapmierinās tikai ar simboliem, kas iegūstami uz klaviatūras? Noteikti nē! Atceramies (vai uzzinam kā nu kurš) par jauko iespēju lietot ALT taustiņu kopā ar cipartastatūras (numeric keypad) taustiņiem. Lūk izmantojam ALT+223 un iegūstam brīnišķīgu kolonas nosaukumu:

SQL> create table abnormal ("▀" number);
Table created.
SQL> desc abnormal
 Name                                      Null?    Type
 ----------------------------------------- -------- -------
 ▀                                                  NUMBER

Tiec nu tagad manai kolonai klāt! 😉

Varam, protams, paeksperimentēt ar iebūvētajām funkcijām, arī tas dod iespēju izveidot kolonu, pie kuras nemaz tik viegli nevar tikt klāt. Tātad neieliekot kolonas nosaukumu pēdiņās, to nemaz neredz.

SQL> create table personas (vards varchar2(10), "SYSDATE" date);
Table created.
SQL> insert into personas values ('Jānis', sysdate-1);
1 row created.
SQL> select vards, sysdate from personas;
VARDS      SYSDATE
---------- ---------
Jānis      31-JAN-09
1 row selected.
SQL> select vards, "SYSDATE" from personas;
VARDS      SYSDATE
---------- ---------
Jānis      30-JAN-09

Nu lūk  nepavisam nav nepieciešams apmierināties tikai ar cipariem un skaitļiem, novest ļaudis totālā nesapratnē var arī daudz elegantāk un efektīvāk 🙂

4 Responses to Par objektu (ne)nosaukumiem

  1. Kaitnieks saka:

    Jums piegādāta žetonu paciņa. Lūdzu, parakstieties šeit.

  2. sql tējkanna saka:

    Vai šajā teikumā “Otra lieta – vienmēr jāatceras, ka kolonas nosaukums jāliek pēdiņās (Oracle) vai apostrofos (MySQL), vai iespējams vēl kādos citos specsimbolos, savukārt, ja IR ielikts, tad atkal lasot kodu ir ļoti viegli palaist garām to, ka tā ir kolona, nevis vienkārši skaitlis 2.” izceltā IR vietā nav domāts nav?!
    Izlasot saprotu tā: “Ja ir ielikts specsimbolos, tad lasot kodu ir ļoti viegli palaist garām to, ka tā ir kollona nevis skaitlis.”,vai nav domāts pretēji?

    • Gints Plivna saka:

      Tātad, ja kaut kas (kas ir domājams kolonas nosaukums) ir ielikts specsimbolos (apostrofos, pēdiņās), tad DBVS tā vietā ņem kolonas nosaukumu. Skatoties piemēram šādu izteiksmi

      SELECT iesnieguma_datums + "10" FROM whatever

      99,9% cilvēku domās, ka kolonai iesnieguma_datums tiek pieskaitītas 10 dienas, lai iegūtu teiksim datumu, līdz kuram tas jāapstrādā. Bet to, ka patiesībā tā ir kolona, kurā iekšā ir pavisam kas cits, pamana tikai retais.
      Skat piemēru:

      SQL> create table cool (iesnieguma_datums date not null, "10" number not null);

      Table created.

      SQL> insert into cool values (sysdate, 25);

      1 row created.

      Šodien ir 17 janvāris, tātad + 10 dienas, ir 27, ja?

      SQL> select iesnieguma_datums + "10" from cool;

      IESNIEGUMA
      ----------
      2011.02.11

      Kāpēc tad es ieguvu 11 februāri????? Tāpēc, ka skaitīju klāt kolonu “10”, nevis skaitli 10. Un kolonā “10” iekšā ir 25, kā es to ieliku ar insertu augstāk.

  3. Jānis saka:

    Nja, vispār sanāk piņķerīga padarīšana, ja grib izdomāt kā tad īsti būtu labā prakse saukt objektus datu bāzē.
    Izklausās, ka katrs veido savu “labo praksi”.

Komentēt