Firebird Embedded - podstawowe pytania

0

Witam.

W związku z problemem z którym spotkałem się przy SQLCE (http://4programmers.net/Forum/Bazy_danych/252660-sql_ce_-_update_z_podzapytaniem_-_jak_zrobic) postanowiłem rozejrzeć się za czymś innym.
Często przy tematach baz plikowych widziałem propozycje Firebird stąd też zainteresowanie tą bazą.

Stworzyłem jakiś testowy projekt tworzący bazę ze strukturą, lecz przy wrzucaniu danych pierwsza niespodzianka:
z tego co wyczytałem w sieci nie ma w Firebird konstrukcji typu :

INSERT INTO Table ( Column1, Column2 ) VALUES
( Value1, Value2 ), ( Value1, Value2 ) 

tylko trzeba to sobić przez SELECT + UNION lub przez BLOCK

No i tutaj pytanie do Was doświadczonych z tymi bazami:
jakie jeszcze niespodzianki (patrząc na bazę w świetle "standardowej" bazy MS SQL 2008) mogą się pojawić ?

0

@hipekk zaopatrz się w jakieś graficzne narzędzie do zarządzania bazą danych. Ze swojej strony polecam IBExpert. Posiada darmową wersję Personal, trzeba się tylko zarejestrować i można używać. Niestety ma ograniczenia w stosunku do pełnej wersji. Ale na początek wystarczy. Takie narzędzie wygeneruje Ci skrypty z tabel testowych.

Co do drugiego pytania trudno mi powiedzieć. Bo nie wiem czego używasz, a MS SQL'a mało tykałem.

0

No właśnie z MS miałem najwięcej styczności (stąd też zdziwienie że składnia INSERT INTO TABLE ( Column1, Column2 ) VALUES ( Value1, Value2 ), ( Value1, Value2 ) nie działa ;) ).

Dziękuję za polecenie softu.
Trafiłem dziś na to : http://www.sqlmanager.net/ wydaje się całkiem przyjazne, ale chętnie sprawdzę Twoją propozycje :)

0

Cóż, niestety do FB brak jest dobrego darmowego narzędzia które wyświetli Ci np. statystyki zapytania. To znaczy liczbę odczytów z cache itp. Z tego co patrzyłem wszystkie narzędzia posiadające fajne funkcje (generator danych, graficzne wyświetlanie planu zapytania, debugowanie stored procedures i masę innych potrzebnych w późniejszym etapie nauki) są płatne, a wersje free mają je wycięte :(

0

Bawię się Firebirdem i natknąłem się na małą "zagadkę":
Na http://www.firebirdfaq.org/ znalazłem zapytanie wyświetlające listę tabel w bazie :

select rdb$relation_name
from rdb$relations
where rdb$view_blr is null 
and (rdb$system_flag is null or rdb$system_flag = 0);

jednak ja chciałbym sprawdzić istnienie konkretnej tabeli więc dopisałem:

select rdb$relation_name
from rdb$relations
where rdb$view_blr is null 
and (rdb$system_flag is null or rdb$system_flag = 0)
and rdb$relation_name like 'KOSZYK'
;

Ku mojemu zdziwieniu zapytanie zwróciło 0 wyników.

Dla odmiany:

select rdb$relation_name
from rdb$relations
where rdb$view_blr is null 
and (rdb$system_flag is null or rdb$system_flag = 0)
and rdb$relation_name like 'KOSZYK%'
;

zwraca jeden wynik KOSZYK.

No i tutaj pytanie do obeznanych z tymi bazami: dlaczego tak się dzieje ?

1

Po pierwsze ja bym zapytanie napisał tak:

SELECT rdb$relation_name
FROM rdb$relations
WHERE rdb$view_blr IS NULL 
AND (rdb$system_flag IS NULL OR rdb$system_flag = 0)
AND rdb$relation_name = 'KOSZYK'

Wtedy powinno być ok.

Po drugie to wynika z tego, że kolumna relation_name jest typu char, a nie varchar:

CREATE TABLE RDB$RELATIONS (
    RDB$VIEW_BLR              BLOB SUB_TYPE 2 SEGMENT SIZE 80,
    RDB$VIEW_SOURCE           BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET UNICODE_FSS,
    RDB$DESCRIPTION           BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET UNICODE_FSS,
    RDB$RELATION_ID           SMALLINT,
    RDB$SYSTEM_FLAG           SMALLINT,
    RDB$DBKEY_LENGTH          SMALLINT,
    RDB$FORMAT                SMALLINT,
    RDB$FIELD_ID              SMALLINT,
    RDB$RELATION_NAME         CHAR(31) CHARACTER SET UNICODE_FSS,
    RDB$SECURITY_CLASS        CHAR(31) CHARACTER SET UNICODE_FSS,
    RDB$EXTERNAL_FILE         VARCHAR(253) CHARACTER SET NONE,
    RDB$RUNTIME               BLOB SUB_TYPE 5 SEGMENT SIZE 80,
    RDB$EXTERNAL_DESCRIPTION  BLOB SUB_TYPE 8 SEGMENT SIZE 80,
    RDB$OWNER_NAME            CHAR(31) CHARACTER SET UNICODE_FSS,
    RDB$DEFAULT_CLASS         CHAR(31) CHARACTER SET UNICODE_FSS,
    RDB$FLAGS                 SMALLINT,
    RDB$RELATION_TYPE         SMALLINT
);

Typ char ma to do siebie, że jest uzupełniany spacjami to wielkości pola (w przeciwieństwie do varchar). Więc aby Twoje zapytanie zadziałało powinieneś napisać:

SELECT rdb$relation_name
FROM rdb$relations
WHERE rdb$view_blr IS NULL 
AND (rdb$system_flag IS NULL OR rdb$system_flag = 0)
AND rdb$relation_name LIKE 'KOSZYK                         ';

Ponieważ długość pola to 31 znaków.

1 użytkowników online, w tym zalogowanych: 0, gości: 1