Autor |
Beitrag |
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: So 08.01.06 15:15
[quote=" e86"
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 
      
Beiträge: 18
Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
|
Verfasst: So 08.01.06 15:42
Hallo,
habe nun folgendes SQL-Statement:
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:
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 :
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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: So 08.01.06 15:46
where lc.rdb$constraint_Type= 'PRIMARY KEY'
_________________ Markus Kinzler.
|
|
e86 
      
Beiträge: 18
Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
|
Verfasst: So 08.01.06 15:55
LOL,
jetzt bekomme ich zurück, dass meine 3 Felder alle Primärschlüssel sind.  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:
SQL-Anweisung 1: 2: 3: 4: 5: 6: 7: 8:
| CREATE TABLE "TABELLE1" ( "ID" SMALLINT NOT NULL, "NAME" CHAR(30) NOT 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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
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 
      
Beiträge: 18
Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
|
Verfasst: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: So 08.01.06 17:34
e86 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 
      
Beiträge: 18
Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
|
Verfasst: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: So 08.01.06 18:24
e86 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
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 = 7) then ftype = 'SmallInt'; if (:ttype = 16) then ftype = 'BigInt'; if (:ttype = 14) then ftype= 'Char'; if (:ttype = 37) then ftype= 'Varchar';
suspend; end end ^
SET TERM ; ^
GRANT EXECUTE ON PROCEDURE "Tabelleninfo" TO SYSDBA; |
_________________ Markus Kinzler.
|
|
e86 
      
Beiträge: 18
Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
|
Verfasst: 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.
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
kOOni
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: So 08.01.06 19:07
e86 hat folgendes geschrieben: | Ähm..
ich frage jetzt einfach mal ganz dumm, ob du mir das nicht auch als reines SQL-Statement schreiben könntest.
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:
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
kOOni[/quote]
Komplette SP:
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 = 7) then ftype = 'SmallInt'; if (:ttype = 16) then ftype = 'BigInt'; if (:ttype = 14) then ftype= 'Char'; if (:ttype = 37) then 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 in( select rdb$index_name from rdb$index_segments where rdb$field_name = :name ) 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; |
Gruß Markus.
_________________ Markus Kinzler.
|
|
e86 
      
Beiträge: 18
Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
|
Verfasst: 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?
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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: So 08.01.06 19:55
e86 hat folgendes geschrieben: | N'abend,
wie muss ich folgenden SQL-Befehl ändern, damit dieser nur für eine bestimmte Tabelle ausgeführt wird?
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 |
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 
      
Beiträge: 18
Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
|
Verfasst: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: So 08.01.06 20:44
Versuchs mal mit
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 
      
Beiträge: 18
Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
|
Verfasst: So 08.01.06 20:51
LOL,
ok, es geht
kOOni
|
|
|