Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Strukturänderung Ja/Nein-Felder in Firebird (https://www.delphipraxis.net/201769-strukturaenderung-ja-nein-felder-firebird.html)

Blackpit 24. Aug 2019 15:12

Datenbank: Firebird • Version: 2.5 • Zugriff über: egal

Strukturänderung Ja/Nein-Felder in Firebird
 
Hallo Gemeinde,
aufgrund einer (von mir erzwungenen ;)) Strukturänderung des DM, muss ich jetzt die Altdaten aus mehreren J/N-Tabellen in ein normalisiertes DM überführen.
Dazu müssen alle Felder durchlaufen werden und wenn Ja, wird ein DS im neuen DM erstellt.
Bevor ich den steinigen Weg gehe, wollte ich fragen ob es per SQL eine Möglichkeit gibt. Ich dachte an sowas wie eine Kreuztabelle.
War schon mal jemand damit konfrontiert oder hat jemand eine Idee?

Gruß
BP

Lemmy 25. Aug 2019 10:30

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Servus,

wenn Du da ne vernünftige Antwort willst, solltest Du schon etwas mehr Informationen raus rücken: Wie sieht dein Datenmodell jetzt aus und wie soll es nachher aussehen.
Zitat:

die Altdaten aus mehreren J/N-Tabellen in ein normalisiertes DM überführen.
lässt ziemlich viel Spielraum....

Neumann 25. Aug 2019 10:38

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Ich habe auch gerätselt was das wohl bedeuten soll

IBExpert 25. Aug 2019 11:23

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Unahängig von der nebulösen Beschreibung, was deine Anforderungen sind, ist so eine Änderung nur wirklich keine Raketenwissenschaft.

Wenn du zum Beispiel eine Stored procedure oder alternativ einen execute block erstellst, mit dem du mit einem for select durch deine Eingangsdaten gehst (falls in anderer db, dann eben per execute statement on external) und dann anhand der vorgefundenen Daten dann inserts in deine neue Tabelle machst, dann ist das schnell und reproduzierbar erledigt.

Oder als Antwort auf deine Frage: Ja, es gibt einen Weg, das mit Firebird SQL Befehlen zu machen.

Ob du das mit den o.a. Stichworten zusammenbauen kannst, kann ich dir nicht sagen, ich schätze aber, das ich anhand deiner Beschreibung dafür maximal 5-15 Minuten brauchen würde, um das umzusetzen, wenn dein Datenmodell schon steht und es nicht 500 Felder in 100 Tabellen sind (dann würde es sicherlich ein wenig länger dauern, aber sicherlich trotzdem weniger als 2 Stunden.

jobo 26. Aug 2019 08:19

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Zitat:

Zitat von Blackpit (Beitrag 1442961)
..
Dazu müssen alle Felder durchlaufen werden und wenn Ja, wird ein DS im neuen DM erstellt.
..

Code:
select <feldliste> from meineSpannendendaten
 where <bestimmtesFeld> = 'JA' (oder true oder 1 oder so)
Wenn dieses Statement so formuliert ist, dass es die gewünschten Werte liefert, kombiniere es mit einem Insert Statement


Code:
insert into <tabelleGemäßneuemDatenmodell> (<feldliste>)
select <feldliste> from meineSpannendendaten
 where <bestimmtesFeld> = 'JA' (oder true oder 1 oder so)
Da brauchst Du erstmal keine Kreuztabelle. Aber vielleicht ist es komplizierter, als Deine Frage ahnen lässt.

Blackpit 7. Sep 2019 17:04

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Hallo,
erstmal Danke für's Feedback.
Bin leider jetzt erst wieder dazugekommen mich zu melden.
so einfach ist die Sache leider nicht. Die Felder entsprechen jetzt ja Tabelleneinträge mit PK der aber unterschiedlich sein kann.
Ich müsste also die Felder mittels phonetischer Suche matchen oder ich erstell mir eine Zuordnungstabelle mit den Feldnamen und den korrrespondierenden Tabelleneinträgen über welchen ich dann den PK bekomme um einen Insert in der neuen Struktur machen zu können.
Bisher hab ich folgendes und komm nicht weiter:
Code:
execute block
returns (myID integer, table_name varchar(100),column_name varchar(100), column_value varchar(100))
as
begin
for select ID from comp group by ID into :myid do
begin
for select f.rdb$relation_name, f.rdb$field_name
from rdb$relation_fields f
join rdb$relations r on f.rdb$relation_name = r.rdb$relation_name
and r.rdb$view_blr is null
and (r.rdb$system_flag is null or r.rdb$system_flag = 0)
where (UPPER(f.RDB$RELATION_NAME) STARTING WITH UPPER('MyDef')) and
(UPPER(f.rdb$field_name) CONTAINING UPPER('_JN'))
order by 1, f.rdb$field_position into :table_name, :column_name do
    begin
    execute statement 'select cast(' || column_name || ' as varchar(100)) from ' || table_name || ' where COMP_ID =' || myid into :column_value;
    suspend;
    end
  end
end
Damit wollte ich von allen Komponenten die Tabellen und Einträge ermitteln.
Im Einzelmodus bekomme ich alle felder mit Inhalten, welche ich noch auf Value = 'j' filtern müsste.
Die Ergebnismenge wäre dann für ein Insertstatement geeignet. Ich steh irgendwie an.
Kann mich jemand mal schubsen? ;)

@IBExpert
Zitat:

Zitat von IBExpert
ich schätze aber, das ich anhand deiner Beschreibung dafür maximal 5-15 Minuten brauchen würde, um das umzusetzen

nehme ich gerne an ;)

IBExpert 7. Sep 2019 20:36

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Was ist denn mit dieser ergebnismenge dein nächstes problem?
Du kannst in einem anderen execute block diesen execute block per execute statement aufrufen und dann ähnlich weiterverarbeiten.
Oder auch dir namen dazu ausdenken und dann execute block durch create procedure name ersetzen , das macht rekursionen einfacher

Blackpit 8. Sep 2019 08:30

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Hallo,
zum einen hätte ich die Ergebnismenge gerne schon nach Wert gefiltert zum anderen muss ich die Feldnamen mit meiner Vergleichstabelle abgleichen um aus der Detailtabelle mit Stringvergleich per Lookup den Schlüssel zu bekommen um das Insertstatement zu erstellen.
Ich arbeite noch nicht solange mit Firebird und habe bisher noch nicht mit Blöcken gearbeitet. Wie rufe ich mit der Ergebnismenge einen neuen Block auf? Ich muss dann wohl noch filtern wenn das im vorherigen Block nicht möglich ist und mit den Lookupwerten das Inserstatement erstellen und ausführen. Gibt es sowas wie ein try except?
Wie könnte der Aufruf aussehen?
Danke vorab
Gruß BP

IBExpert 8. Sep 2019 08:59

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Code:
execute block
returns (tblname varchar(31))
as
declare variable sql varchar(2000);
begin
  sql='execute block
returns (tbl varchar(80))
as
begin
  for select rdb$relation_name from rdb$relations into tbl do
  suspend;
  when any do
  begin
   --hier kannst du z.B. exception wie hier einfach ignorieren
   --oder mit exception exceptionname selber definieren
   --falls du ''Stringkonstanten'' braucht, doublequotes nehmen
  end
end';

  for execute statement :sql into tblname do
  begin
    if (tblname not containing '$') then suspend ;
  end
end

Blackpit 8. Sep 2019 10:42

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Hallo Holger,
wenn ich das richtig interpretiere führe ich den Block als Statement aus und arbeite mit dessen Resultset weiter.
Die exception über "when any do" gilt hier entsprechend für den neuen Block, in dem ich dann die Insertstatements ausführen würde.
Soweit so gut, aber wo soll ich meine Ergebnismenge filtern, im "for execute statement"? Und wie würdest du den Vergleich der column-fieldnames mit den Bezeichnungen der Detailtabelle und den lookup für den Key integrieren?
Die Frage nach Exception stellte sich mir, da es vorkommen kann, dass in der Detailtabelle kein DS für den Wert aus der Vergleichstabelle exisitiert. In diesem fall müsste in der Detailtabelle ein neuer DS erstellt werden und der neue Key übergeben werden. Es sollte somit sichergestellt sein, das dieser Block immer den Key zurückgibt.
Gruß BP

IBExpert 8. Sep 2019 11:03

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
mach das dann lieber über extra prozeduren, in fb3 könntest du die als hilfsprozeduren in einer einer package ablegen
und auf der results direkt deine where bedingungen legen (packages sind so ähnlich wie units in delphi, was außerhalb
sichtbar ist muss dann in den head).

Aufruf erfolgt dann in fb3 über
Code:
select * from tools.getusertables
wenn du das in fb<3 machen willst, nimm einfach die beiden sps aus dem recreate teil und erstelle die ohne package, aufruf dann
ohne tools. vor dem objektnamen


Code:
SET TERM ^ ;

CREATE OR ALTER package tools
as
begin
  procedure GetUserTables
  returns (tblname varchar(31));

 
end^

RECREATE package body tools
as
begin
procedure GetAllTableName
returns (tbl varchar(80))
as
begin
  for select rdb$relation_name from rdb$relations into tbl do
  suspend;
  when any do
  begin
   --hier kannst du z.B. exception wie hier einfach ignorieren
   --oder mit exception exceptionname selber definieren
   --falls du ''Stringkonstanten'' braucht, doublequotes nehmen
  end
end
 
procedure GetUserTables
returns (tblname varchar(31))
as
begin
  for select tbl from GetallTableName where tbl not containing '$' into tblname do
  begin
    suspend ;
  end
end
end
^

SET TERM ; ^

/* Existing privileges on this package */

GRANT EXECUTE ON PACKAGE TOOLS TO SYSDBA;

Blackpit 8. Sep 2019 11:16

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Hallo Holger,
ist ja ein cooles Feature, aber leider erst in FB3 (hab hier 2.5) trotzdem gut zu wissen :thumb:
Dann werd ich mal mein Glück versuchen, wenn ich anstehe würde ich mich nochmal melden.
BTW ich würde das ganze noch gern protokollieren, gibt's dafür integrierte Mechanismen oder IBExpert-Tools?
Vielen Dank schonmal für die Unterstützung!
Gruß BP

IBExpert 8. Sep 2019 11:24

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
In der Vollversion im SP Editor einfach mal oben auf Versioncontrol klicken und den dialog dann bestätigen, ab dann findest du in dem Reiter alle con dir erfolgreich compilierten Versionen deiner sp (geht auch mit trigger und bei fb3 package und functions).

Mit tools-database compare kannst du auch ein script erzeugen,um den metadata stand vor einer ziel db auf den metadata stand der quell db abzugleichen, ohne daten zu verlieren. In dem ibeblock reiter sind dazu dann jeweils die Script versionen, um das zu automatisieren mit ibescript.exe

Bei der Personal edition fehlt das aber

Blackpit 8. Sep 2019 17:12

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Hallo,
wenn ich das ganze in Prozeduren unterteile, kann ich es evtl auch gleich so machen:
In Proc GETTALLDETAILS bekomme ich alle Felder für alle Komponenten, in WorkOnDETAILS würde ich die Ergebnisse filtern, mit der Vergleichstabelle die entsprechende Bezeichnung ermitteln, in der Detailtabelle nachschlagen und die ID für das Insertstatement zurückbekommen und Insert ausführen.
Code:
  procedure WorkOnDETAILS                                                    
  as
  variables
   DET_ID integer;
   BEZ varchar(100);
  begin
    for select myID, column_name, column_value
        from GETALLDETAILS
        where column_value = Upper(''j'')
        into myid, column_name, column_value
    do
    begin
    select Bezeichnung from Vergleichstabelle where ColField = colfield_name into :Bez;
    suspend;
    select ID from comp_details where Bezeichnung = :Bez into DET_ID;
    suspend;
    if (id is null) then
    Insert into comp_details set bezeichnung = Bez
    return DET_ID
    suspend;
    else
    begin
    Insert into comp_cat_detail set (KAT_ID,DET_ID,CompID) Values(1,:DET_ID,myID)
    end
    end
  end;
Könnte das auch so gehen?

IBExpert 8. Sep 2019 18:09

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
beim insert hat das set nix zu suchen und wenn das variablen sein sollen in deinem ersten select muss du die in sql anweisungen mit : als präfix ansprechen

wirkt irgendwie noch alles kraut und rüben zusammengetippt und nicht funktionierend in eine sp,
aber generell geht das, ggf eben über den umweg execute statement, wenn das keine echten objektnamen sind

Blackpit 8. Sep 2019 18:28

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Danke, das wollt ich wissen.
Sollte nur als Beispiel dienen, die Anmerkungen sind schon klar.
Beim Suspend bekomme ich auch mit execute statement eine Fehlermeldung, woran kann das liegen?
Noch was, kann ich Blöcke auch in Procs verwenden?
Nochmals vielen Dank, hast mir schon sehr geholfen!
Gruß BP

IBExpert 8. Sep 2019 19:03

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
daran, das es wohl einen fehler gab
und ja, execute blocks gehen immer auch per execute statement

Blackpit 9. Sep 2019 08:12

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Zitat:

Zitat von IBExpert (Beitrag 1445243)
daran, das es wohl einen fehler gab...

:thumb: Du hast mir den Tag erhellt :-D
War blöd formuliert, der Einsatz von suspend war mir noch nicht ganz klar, hab mich nochmal schlau gemacht.
Wenn ich die Vergleichsliste fertig hab, sehe ich ob es funktioniert.
Danke nochmals!

Blackpit 9. Sep 2019 15:07

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Hallo,
muss mich leider nochmal melden.
Vergleichstabelle erstellt und Prozedur im Einzelschrittmodus getestet.
Läuft wie programmiert, sobald ich sie jedoch fertig laufen lasse bekomme ich
Zitat:

multiple rows in singleton select.
At procedure 'GETALLDETAILS' line: 24, col: 7.
Die Prozedur hat aber nur 22 Zeilen:?:
Proc GETALLDETAILS wir in Proc GETCOMPDETAILS gerufen.

GETALLDETAILS
Code:
begin
  for select COMP_ID
      from COMP_AUS
      group by COMP_ID
      into :MYID
  do
  begin
    for select F.RDB$RELATION_NAME, F.RDB$FIELD_NAME
        from RDB$RELATION_FIELDS F
        join RDB$RELATIONS R on F.RDB$RELATION_NAME = R.RDB$RELATION_NAME and R.RDB$VIEW_BLR is null and (R.RDB$SYSTEM_FLAG is null or R.RDB$SYSTEM_FLAG = 0)
        where (upper(F.RDB$RELATION_NAME) starting with upper('COMP_AUS')) and
              (upper(F.RDB$FIELD_NAME) containing upper('_JN'))
        order by 1, F.RDB$FIELD_POSITION
        into :TABLE_NAME, :COLUMN_NAME
    do
    begin
      execute statement 'select cast(' || COLUMN_NAME || ' as varchar(100)) from ' || TABLE_NAME || ' where COMP_ID =' || MYID
          into :COLUMN_VALUE;
      suspend;
    end
  end
end
GETCOMPDETAILS
Code:
create or alter procedure GETCOMPDETAILS (
    MYID integer,
    COLUMN_NAME varchar(100) character set UTF8,
    COLUMN_VALUE varchar(100) character set UTF8)
as
declare variable DET_ID integer;
declare variable BEZEICH varchar(100) character set UTF8;
  begin
    for select first 1 myID, column_name, column_value  /*<--- multiple rows fehler beseitigt */
        from GETALLDETAILS
        where UPPER(COLUMN_VALUE) = UPPER('j')
        into myid, column_name, column_value
    do
    begin
    select Bezeichnung from dmchange where Field_Name = :column_name into :Bezeich;
    if (column_name not CONTAINING 'xxx') then
    begin
    select AUS_DET_ID from comp_aus_detail where Bezeichnung = :Bezeich into :DET_ID;
    if (bezeich <> '' and det_id is null) then
    begin
    Insert into comp_aus_detail (bezeichnung) Values (:Bezeich) returning aus_det_id into :det_id;
    suspend;
    end
    if (det_id is not null) then
    insert into comp_kat_details (KAT_ID,DET_ID,KID_ID) values (1,:DET_ID,:myid);
    end
    end
  end;
GETALLDETAILS läuft alleine durch und liefert die gewünschten Daten ohne Fehlermeldung.
Woran kann das liegen?

Nachtrag: Den Fehler habe ich mit "First 1" im Select wegbekommen (Datenlage), aber scheibar wird nicht commitet, Tabelle wird nicht gefüllt??

IBExpert 9. Sep 2019 19:20

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
den commit musst der aufrufende machen, alle sps laufen in dessen transaktionskontext, in ibexpert also oben nach dem ausführen oben den toolbutton für commit anklicken.
die Fehlermeldung mit zeile xx kann auch aus dem execute statement kommen, daher kann das passen. Bei Zeilennummern zählen auch die im Header mit (es gibt in IBExpert eine toolbutton lazymode, dann erst siehst du den kompletten source, in deinem oberen Beispiel fehlt das scheinbar.

Blackpit 9. Sep 2019 19:58

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Hallo,
hier beide komplett:

GETALLDETAILS
Code:
SET TERM ^ ;

create or alter procedure GETALLDETAILS
returns (
    MYID integer,
    TABLE_NAME varchar(100) character set UTF8,
    COLUMN_NAME varchar(100) character set UTF8,
    COLUMN_VALUE char(100) character set UTF8)
as
begin
  for select COMP_ID
      from COMP_AUS
      group by COMP_ID
      into :MYID
  do
  begin
    for select F.RDB$RELATION_NAME, F.RDB$FIELD_NAME
        from RDB$RELATION_FIELDS F
        join RDB$RELATIONS R on F.RDB$RELATION_NAME = R.RDB$RELATION_NAME and R.RDB$VIEW_BLR is null and (R.RDB$SYSTEM_FLAG is null or R.RDB$SYSTEM_FLAG = 0)
        where (upper(F.RDB$RELATION_NAME) starting with upper('COMP_AUS')) and
              (upper(F.RDB$FIELD_NAME) containing upper('_JN'))
        order by 1, F.RDB$FIELD_POSITION
        into :TABLE_NAME, :COLUMN_NAME
    do
    begin
      execute statement 'select cast(' || COLUMN_NAME || ' as varchar(100)) from ' || TABLE_NAME || ' where COMP_ID =' || MYID
          into :COLUMN_VALUE;
      suspend;
    end
  end
end^

SET TERM ; ^

GRANT SELECT ON COMP_AUS TO PROCEDURE GETALLDETAILS;

GRANT EXECUTE ON PROCEDURE GETALLDETAILS TO MYDB;
GETCOMPDETAILS
Code:
SET TERM ^ ;

create or alter procedure GETCOMPDETAILS
as
declare variable DET_ID integer;
declare variable BEZEICH varchar(100) character set UTF8;
declare variable MYID integer;
declare variable COLUMN_NAME varchar(50) character set UTF8;
  begin
    for select myID, column_name
        from GETALLDETAILS
        where UPPER(COLUMN_VALUE) = UPPER('j')
        into myid, column_name
    do
    begin
    if (column_name not CONTAINING 'xxx') then
    begin
    select Bezeichnung from dmchange where Field_Name = :column_name into :Bezeich;
    select AUS_DET_ID from comp_aus_detail where Bezeichnung = :Bezeich into :DET_ID;
    if (bezeich is null and det_id is null) then
    begin
    Insert into comp_aus_detail (bezeichnung) Values (:Bezeich) returning aus_det_id into :det_id;/*return gen_ID*/
    suspend;
    end
    if (det_id is not null) then
    insert into comp_kat_details (KAT_ID,DET_ID,KID_ID) values (1,:DET_ID,:myid);
    end
    end
  end;^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE GETALLDETAILS TO PROCEDURE GETCOMPDETAILS;

GRANT SELECT ON DMCHANGE TO PROCEDURE GETCOMPDETAILS;

GRANT SELECT,INSERT ON COMP_AUS_DETAIL TO PROCEDURE GETCOMPDETAILS;

GRANT INSERT ON COMP_KAT_DETAILS TO PROCEDURE GETCOMPDETAILS;

GRANT EXECUTE ON PROCEDURE GETCOMPDETAILS TO MYDB;
Erste Proc allein liefert wie gewünscht.
Im Einzelschritt läüft GETCOMPDETAILS auch wie es soll.
Wenn ich es durchlaufen lasse nicht mehr:?
Ich dachte erst an Feldnamendoppellungen welche auch existieren, erklären kann ich es mir nicht.

jobo 10. Sep 2019 07:08

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Zitat:

Zitat von Blackpit (Beitrag 1445397)
Code:
..
create or alter procedure GETCOMPDETAILS
as
..
    begin
    select Bezeichnung from dmchange where Field_Name = :column_name into :Bezeich;
    select AUS_DET_ID from comp_aus_detail where Bezeichnung = :Bezeich into :DET_ID;
Ich dachte erst an Feldnamendoppellungen welche auch existieren, erklären kann ich es mir nicht.

Das kann durchaus sein, kommt auf die Natur der Felder an, die Du in beiden Selects oben als Einschränkung verwendest.

Nur wenn die Felder Field_Name und Bezeichnung (die ja die einzige Einschränkung sind) unique sind und idealer Weise auch so deklariert sind, dann kann das select immer funktionieren.
Wenn das Datenmodell an der Stelle keine Eindeutigkeit garantiert, brauchst Du weitere Felder zur Einschränkung, bis sichergestellt ist, dass immer 1 oder auch kein Datensatz als Ergebnis kommt.

mkinzler 10. Sep 2019 07:15

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Zitat:

Wenn das Datenmodell an der Stelle keine Eindeutigkeit garantiert, brauchst Du weitere Felder zur Einschränkung, bis sichergestellt ist, dass immer 1 oder auch kein Datensatz als Ergebnis kommt.
Oder man limitiert das Abfragergebnis auf einen Eintrag.

jobo 10. Sep 2019 07:29

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Stimmt!
Schien mir in dem Zusammenhang nicht sinnvoll, aber es behebt den Fehler.

mkinzler 10. Sep 2019 07:32

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Ob, es sinnvoll ist steht auf einem anderen Blatt.

Blackpit 10. Sep 2019 11:46

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Zitat:

Wenn das Datenmodell an der Stelle keine Eindeutigkeit garantiert, brauchst Du weitere Felder zur Einschränkung, bis sichergestellt ist, dass immer 1 oder auch kein Datensatz als Ergebnis kommt.
Das neue schon, das alte nicht daher die Vergleichstabelle.
Aber auch mit eleminierten Feldnamendoppellungen (Eindeutigkeit in der Vergleichstabelle) laufe ich auf den Fehler.
Ich gehe davon aus, das Ergebnis der ersten Proc als Resultset zu bekommen, welches ich in der zweiten abarbeiten kann. Im Debugmodus läuft es ja!
Die Einschränkung des Resultsets über die Felder dessen Value 'j' ist erzeugt ein neues RS was mir dann scheinbar das Problem macht.
Ansonsten müsste ich den Fehler doch schon beim ausführen der ersten Proc bekommen, oder irre ich mich da?

IBExpert 10. Sep 2019 17:26

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
es hindert dich eigentlich auch niemand daran, statt der variablen die werte in rückgabe parameter zu packen und bei jedem vorgang einen supend einzuwerfen,mit dem du dann sehen kannst, wie weit der kommt. Es bringt aber nichts, auf Hilfe zu hoffen, wenn kein anderer deine Daten hat.

jobo 10. Sep 2019 19:08

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Zitat:

Zitat von Blackpit (Beitrag 1445397)

Code:
create or alter procedure GETALLDETAILS
returns (
    MYID integer,
    TABLE_NAME varchar(100) character set UTF8,
    COLUMN_NAME varchar(100) character set UTF8,
    COLUMN_VALUE char(100) character set UTF8)
as
begin
  for select COMP_ID
      from COMP_AUS
      group by COMP_ID
      into :MYID
  do
  begin
    for select F.RDB$RELATION_NAME, F.RDB$FIELD_NAME
        from RDB$RELATION_FIELDS F
        join RDB$RELATIONS R on F.RDB$RELATION_NAME = R.RDB$RELATION_NAME and R.RDB$VIEW_BLR is null and (R.RDB$SYSTEM_FLAG is null or R.RDB$SYSTEM_FLAG = 0)
        where (upper(F.RDB$RELATION_NAME) starting with upper('COMP_AUS')) and
              (upper(F.RDB$FIELD_NAME) containing upper('_JN'))
        order by 1, F.RDB$FIELD_POSITION
        into :TABLE_NAME, :COLUMN_NAME
    do

Und das sind noch mehr select..into mit dem gleichen Problem. Und das Group By in dem Select ist schon ein Schritt in die richtige Richtung, garantiert aber keinen Datensatzanzahl < 2.

Und IBExpert hat Recht mit seinen Hinweisen:
1. niemand hier hat Deine Daten und eine Struktur, die Eindeutigkeit sicherstellt gibt es ja so offenbar nicht. (Dafür sind Datenmodelle eigentlich da) Also folgt: alles ist möglich
2. Die Nutzung von SP ohne Parameter ist schon etwas fraglich. Also wenn schon "funktionale Programmierung" in SQL, wieso nicht gleich mit Eingangsparameter?
Ich habe mir das "Innenleben" der SP noch nicht so wirklich angeschaut, aber woher soll in der SP Getalldetails die Dynamik kommen?
Befüllst Du die Tabelle Comp_Aus vorher unterschiedlich?

Blackpit 11. Sep 2019 00:52

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Zitat:

Zitat von IBExpert (Beitrag 1445563)
es hindert dich eigentlich auch niemand daran, statt der variablen die werte in rückgabe parameter zu packen und bei jedem vorgang einen supend einzuwerfen,mit dem du dann sehen kannst, wie weit der kommt. Es bringt aber nichts, auf Hilfe zu hoffen, wenn kein anderer deine Daten hat.

Das war's doch:-D
Mit Ausgabeparameter und suspend hab ich es hinbekommen!
Danke an alle!


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz