Autor Beitrag
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 08.01.06 15:15 
[quote="user profile icone86"
Wegen dem Spaltentyp: Da steht eine Nummer. Ist das eine ID, welche ein Fremdschlüssel ist, der auf eine andere Tabelle verweist? Wie kann ich hierbei den 'richtigen' Datentyp alá CHAR oder INTEGER bspw. bestimmen?
Zitat:

Da habe ich leider auch nichts gefunden. :(

Nun fehlt mir noch:

- Defaultwert
- PRIMARY KEY
- AUTO_INCREMENT

Ich habe aber keine entsprechenden Tabellen mit ähnlich klingenden Namen gefunden. :( [/quote]

-Informationen über Primär- und Fremdschlüssel findest du in der Tabelle rdb$relation_constraints.
-Autoincrement gibt es nicht direkt in FB, hier wird das z.B. über einen (Before Insert-)Trigger und einem Generator gelöst. Trigger in rdb$triggers, und Generatoren in rdb$generators
Zitat:

Anbei, wie war das nochmal, dass ich mir nur die Informationen der Spalten einer bestimmten Tabelle zurückgeben lasse? Hier geschieht dies ja für alle Tabellen, welche von Usern erstellt wurden.
kOOni

where um rdb$relation_name = '<tabellenname>' erweitern

_________________
Markus Kinzler.
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: So 08.01.06 15:42 
Hallo,

habe nun folgendes SQL-Statement:

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
select
 f.rdb$field_name, s.RDB$Field_Length, s.RDB$field_type, s.RDB$description, 
 f.rdb$null_flag, lc.rdb$constraint_type

from
 rdb$relation_fields f, rdb$fields s, rdb$relation_constraints lc

where
 NOT (f.RDB$RELATION_NAME LIKE 'IBE$%'AND
 NOT (f.RDB$RELATION_NAME LIKE 'RDB$%'AND
 s.rdb$field_name = f.rdb$field_source  AND
 lc.rdb$relation_name = f.rdb$relation_name


Damit spuckt er mir aber komische Werte aus. Beispielsweise hat die Spalte "ID" 4 Einträge:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
RDB$Field_Name | RDB$Field_Length | RDB$Field_Type | RDB$DESCRIPTION | RDB$NULL_FLAG | RDB$CONTRAINT_TYPE

ID | 2 | 7 | Null | 1 | NOT NULL
ID | 2 | 7 | Null | 1 | NOT NULL
ID | 2 | 7 | Null | 1 | PRIMARY KEY
ID | 2 | 7 | Null | 1 | FOREIGN KEY


Ich brauche aber nur den Wert, ob es ein PRIMARY KEY ist. Der Rest ist mir egal. Ich wollte gruppieren lasse mit :

ausblenden SQL-Anweisung
1:
group by RDB$FIELD_NAME					


Aber da kam der Fehler:

Ambiguous field name between table RDB$RELATION_FIELDS and table RDB$FIELDS
RDB$FIELD_NAME


Wie kann ich das bewerkstelligen, dass er mir nur ausgibt, ob die Zeile ein PRIMARY KEY ist?

Nun fehlt mir erst einmal nur noch dazu der Default-Wert. Wie kann ich auf diesen kommen?


kOOni
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 08.01.06 15:46 
where lc.rdb$constraint_Type= 'PRIMARY KEY'

_________________
Markus Kinzler.
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: So 08.01.06 15:55 
LOL,

jetzt bekomme ich zurück, dass meine 3 Felder alle Primärschlüssel sind. :roll: Und das Komische dabei ist, dass die Felder NOT NULL, PRIMARY KEY und FOREIGN KEY sind.. :?

Irgendwie stehe ich da total auf dem Schlauch. Hier dazu einmal vorsichtshalber der SQL-Befehl für die Tabellenbeschreibung:

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
/* Table: TABELLE1, Owner: SYSDBA */
CREATE TABLE "TABELLE1"
(
  "ID"  SMALLINT NOT NULL,
  "NAME"  CHAR(30NOT NULL,
  "ALTER"  SMALLINT,
 PRIMARY KEY ("ID")
);


Da steht doch, dass nur die ID ein PRIMARY KEY ist... :?

Also, wie kann ich mir den Defaultwert für die Spalten zurückgeben lassen? Und wie
bekomme ich heraus, ob eine Spalte PRIMARY KEY ist oder nicht?


Danke,
kOOni
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 08.01.06 16:08 
Zitat:

Also, wie kann ich mir den Defaultwert für die Spalten zurückgeben lassen?


rdb$default_value

Zitat:
Und wie
bekomme ich heraus, ob eine Spalte PRIMARY KEY ist oder nicht?


Nicht in einer Abfrage. Über zweite Abfrage
ausblenden SQL-Anweisung
1:
select count (rdb$constraint_type) where rdb$relation_name = <relation_name> and rdb§relation_type ='PRIMARY_KEY';					

wenn count = 1 dann Primary Key oder das ganze in eine SP verpacken.

_________________
Markus Kinzler.
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: So 08.01.06 17:26 
Ok,

wie komme ich jetzt an die Datentypen der Spalten selber? In der Übersicht stehen bei mir nur Zahlen wie 7, 14 usw... :?


kOOni
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 08.01.06 17:34 
user profile icone86 hat folgendes geschrieben:
Ok,

wie komme ich jetzt an die Datentypen der Spalten selber? In der Übersicht stehen bei mir nur Zahlen wie 7, 14 usw... :?


kOOni


Durch Vergleichen mit den Typen der Tabelle 16 ist BigInt, 14 ist Char, 7 ist SmallInt usw.

Könnte man bei der Lösung in SP in Klartext zurückgeben.

_________________
Markus Kinzler.
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: So 08.01.06 18:02 
Hallo,

Zitat:
Durch Vergleichen mit den Typen der Tabelle 16 ist BigInt, 14 ist Char, 7 ist SmallInt usw.

Könnte man bei der Lösung in SP in Klartext zurückgeben.


Welche Tabelle bei den Datentypen meinst du? Könntest du mir dies bitte in einem SQL-Statement zeigen :)

Und was ist "SP"?


kOOni
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 08.01.06 18:24 
user profile icone86 hat folgendes geschrieben:


Welche Tabelle bei den Datentypen meinst du? Könntest du mir dies bitte in einem SQL-Statement zeigen :)

Und was ist "SP"?


Stored Procedure

ausblenden volle Höhe SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
SET TERM ^ ;

CREATE PROCEDURE "Tabelleninfo" (
    TABELLE CHAR(32))
RETURNS (
    NAME CHAR(32),
    FIELDLEN SMALLINT,
    FTYPE CHAR(16),
    NULLFLAG CHAR(8),
    ISPK CHAR(12),
    ISFK CHAR(12),
    DESCRIP VARCHAR(128))
AS
DECLARE VARIABLE TTYPE SMALLINT;
DECLARE VARIABLE TANZ SMALLINT;
begin
  for
  select
      f.rdb$field_name, s.RDB$Field_Length, s.RDB$field_type,
      s.RDB$description, f.rdb$null_flag
  from
     rdb$relation_fields f, rdb$fields s 
  where
     f.rdb$relation_name = :tabelle and
     NOT (f.RDB$RELATION_NAME LIKE 'IBE$%'AND
     NOT (f.RDB$RELATION_NAME LIKE 'RDB$%'AND
     s.rdb$field_name = f.rdb$field_source
  into
     :name, :Fieldlen, :ttype, :Descrip, :NullFlag
     do
     begin
        if (:ttype = 7then ftype = 'SmallInt';
        if (:ttype = 16then ftype = 'BigInt';
        if (:ttype = 14then ftype= 'Char';
        if (:ttype = 37then ftype= 'Varchar';
/*       for select
             count (rdb$constraint_type)
           from
              rdb$relation_constraints
          where
              rdb$relation_name = :TABELLE and
              RDB$CONSTRAINT_TYPE = 'PRIMARY_KEY'
          into
              :TANZ
          do
          begin
              if (:TANZ = 1) then
              begin
                  ISPK = 'PRIMARY_KEY' ;
              end
              else
              begin
                  ISPK = '';
              end
          end  */

       suspend;
     end
end
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE "Tabelleninfo" TO SYSDBA;

_________________
Markus Kinzler.
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: So 08.01.06 18:54 
Ähm..

ich frage jetzt einfach mal ganz dumm, ob du mir das nicht auch als reines SQL-Statement schreiben könntest. :oops:

Ich brauche dies in einer Anwendung und da ich mit diesen SP's keine Ahnung hab und ich mächtig unter Zeitdruck stehe, würde ich es gerne als reines SQL-Statement haben. Wenn das ginge.

Statement muss können:

- Rückgabe der Spaltennamen, Spaltentypen, Spaltenlänge, der Defaultwert und ob sie NULL sein können
- dabei sollte dies nur von einer vorher angegebenen Tabelle gemacht werden

Wäre sehr schön, wenn du das schreiben könntest :) :P


kOOni
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 08.01.06 19:07 
user profile icone86 hat folgendes geschrieben:
Ähm..

ich frage jetzt einfach mal ganz dumm, ob du mir das nicht auch als reines SQL-Statement schreiben könntest. :oops:

Ich brauche dies in einer Anwendung und da ich mit diesen SP's keine Ahnung hab und ich mächtig unter Zeitdruck stehe, würde ich es gerne als reines SQL-Statement haben. Wenn das ginge.


Das geht leider nicht, da SQL mengenorientiert ist. PL/SQL von SP's und Triggern kennt weitere Befehle wie if then else usw.
Du kannst aber die Ersetztung der typids durch die Klartextbeschreibung in deinem Programm machen.
Um festzustellen welches Feld ein Primärschlüssel ist brauchst du eine 2. Abfrage, welche ich in der SP in einer Schleife für jede Zeile des Ergebnisses mache.

SP werden direkt in die datenbank geschrieben und werden auch direkt von ihr ausgeführt. man kann auf sie wie auf Tabellen/Views zugreifen: in meinem Beispiel:
ausblenden SQL-Anweisung
1:
 select * from "Tabelleninfo"( <tabellenname>;					

[/quote]

Anlegen kannst du sie mit Hilfe eines Admintool ( wie IBConsole, IbExpert, IBEasy+, Marathon, usw.)
Statement muss können:

- Rückgabe der Spaltennamen, Spaltentypen, Spaltenlänge, der Defaultwert und ob sie NULL sein können
- dabei sollte dies nur von einer vorher angegebenen Tabelle gemacht werden

Wäre sehr schön, wenn du das schreiben könntest :) :P


kOOni[/quote]

Komplette SP:

ausblenden volle Höhe SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
SET TERM ^ ;

CREATE PROCEDURE "Tabelleninfo" (
    TABELLE CHAR(32))
RETURNS (
    NAME CHAR(32),
    FIELDLEN SMALLINT,
    FTYPE CHAR(16),
    NULLFLAG CHAR(8),
    ISPK CHAR(12),
    ISFK CHAR(12),
    DESCRIP VARCHAR(128))
AS
DECLARE VARIABLE TTYPE SMALLINT;
DECLARE VARIABLE TANZ SMALLINT;
begin
  for
  select
      f.rdb$field_name, s.RDB$Field_Length, s.RDB$field_type,
      s.RDB$description, f.rdb$null_flag
  from
     rdb$relation_fields f, rdb$fields s 
  where
     f.rdb$relation_name = :tabelle and
     NOT (f.RDB$RELATION_NAME LIKE 'IBE$%'AND
     NOT (f.RDB$RELATION_NAME LIKE 'RDB$%'AND
     s.rdb$field_name = f.rdb$field_source
  into
     :name, :Fieldlen, :ttype, :Descrip, :NullFlag
     do
     begin
        if (:ttype = 7then ftype = 'SmallInt';
        if (:ttype = 16then ftype = 'BigInt';
        if (:ttype = 14then ftype= 'Char';
        if (:ttype = 37then ftype= 'Varchar';
        for select
             count (rdb$constraint_type)
           from
              rdb$relation_constraints c
          where
              c.rdb$relation_name = :TABELLE and
              c.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY' and
              c.rdb$index_name inselect
                                       rdb$index_name
                                   from
                                       rdb$index_segments
                                   where rdb$field_name = :name )
          into
              :TANZ
          do
          begin
              if (:TANZ = 1then
              begin
                  ISPK = 'PRIMARY KEY' ;
              end
              else
              begin
                  ISPK = '';
              end
          end
       suspend;
     end
end
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE "Tabelleninfo" TO SYSDBA;


Gruß Markus.

_________________
Markus Kinzler.
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: So 08.01.06 19:44 
N'abend,

wie muss ich folgenden SQL-Befehl ändern, damit dieser nur für eine bestimmte Tabelle ausgeführt wird?

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
SELECT f.rdb$field_name as FieldName,
 s.RDB$Field_Length as FieldLength, 
 s.RDB$field_type as FieldType, 
 f.rdb$null_flag as NullFlag 

FROM   rdb$relation_fields f, rdb$fields s 

WHERE  
 NOT (f.RDB$RELATION_NAME LIKE 'IBE$%'AND 
 NOT (f.RDB$RELATION_NAME LIKE 'RDB$%'AND 
 s.rdb$field_name = f.rdb$field_source


Es soll für die Tabelle "Tabelle1" sein.

Nachtrag:
Ich muss es ohne Stored Procedures ausführen!


kOOni
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 08.01.06 19:55 
user profile icone86 hat folgendes geschrieben:
N'abend,

wie muss ich folgenden SQL-Befehl ändern, damit dieser nur für eine bestimmte Tabelle ausgeführt wird?

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
SELECT f.rdb$field_name as FieldName,
 s.RDB$Field_Length as FieldLength, 
 s.RDB$field_type as FieldType, 
 f.rdb$null_flag as NullFlag 

FROM   rdb$relation_fields f, rdb$fields s 

WHERE  
 NOT (f.RDB$RELATION_NAME LIKE 'IBE$%'AND 
 NOT (f.RDB$RELATION_NAME LIKE 'RDB$%'AND 
 s.rdb$field_name = f.rdb$field_source


Es soll für die Tabelle "Tabelle1" sein.

Nachtrag:
Ich muss es ohne Stored Procedures ausführen!


kOOni

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
SELECT f.rdb$field_name as FieldName,
 s.RDB$Field_Length as FieldLength, 
 s.RDB$field_type as FieldType, 
 f.rdb$null_flag as NullFlag 

FROM   rdb$relation_fields f, rdb$fields s 

WHERE 
 f.rdb$relation_name = 'Tabelle1'  and 
 NOT (f.RDB$RELATION_NAME LIKE 'IBE$%'AND 
 NOT (f.RDB$RELATION_NAME LIKE 'RDB$%'AND 
 s.rdb$field_name = f.rdb$field_source

_________________
Markus Kinzler.
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: So 08.01.06 20:31 
Hallo,

das Ergebnis ist eine Tabelle, in der alle Werte "null" sind. Scheint so, als würde er die Tabelle nicht finden, obwohl es sie doch gibt.. :?

Kann es sein, dass wir die falsche Systemtabelle abfragen?


kOOni
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 08.01.06 20:44 
Versuchs mal mit
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
SELECT f.rdb$field_name as FieldName,
 s.RDB$Field_Length as FieldLength, 
 s.RDB$field_type as FieldType, 
 f.rdb$null_flag as NullFlag 

FROM   rdb$relation_fields f, rdb$fields s 

WHERE 
 Upper(f.rdb$relation_name) = Upper('Tabelle1')  and 
 NOT (f.RDB$RELATION_NAME LIKE 'IBE$%'AND 
 NOT (f.RDB$RELATION_NAME LIKE 'RDB$%'AND 
 s.rdb$field_name = f.rdb$field_source


Query an sich funktioniert kann also nur an Gro/Kleinschreibung ( Dialekt 3?) liegen.

_________________
Markus Kinzler.
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: So 08.01.06 20:51 
LOL,

ok, es geht :P


kOOni