Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi sp lässt sich nicht erstellen (https://www.delphipraxis.net/69779-sp-laesst-sich-nicht-erstellen.html)

sancho1980 19. Mai 2006 20:23

Datenbank: firebird 1.5 • Zugriff über: ibx, ibexpert

sp lässt sich nicht erstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
hallo!
ich wollte gerade wieder eine sp erstellen und auf einmal bekomm ich irgendeine meldung, dass ich irgendeinen unique index
doppelt belegen will...ist mir unerklärlich..blickt ihr das? (db ist im anhang)
SQL-Code:
SET TERM ^ ;

create PROCEDURE GET_NEXT_20_DICENTRIES_BY_ID (
    ID BIGINT)
RETURNS (
    DATUM DATE,
    AUT VARCHAR(3) CHARACTER SET WIN1252,
    ZSDEF BLOB SUB_TYPE 1 SEGMENT SIZE 4096 CHARACTER SET WIN1252,
    ZSSEM VARCHAR(80) CHARACTER SET WIN1252,
    UPDAUT VARCHAR(3) CHARACTER SET WIN1252,
    ZSQCODE VARCHAR(15) CHARACTER SET WIN1252,
    ZSPRGM VARCHAR(20) CHARACTER SET WIN1252,
    ASQCODE VARCHAR(15) CHARACTER SET WIN1252,
    ZSVERW VARCHAR(80) CHARACTER SET WIN1252,
    ZSABK VARCHAR(10) CHARACTER SET WIN1252,
    UPDDATUM DATE,
    ZSAUDIO VARCHAR(20) CHARACTER SET WIN1252,
    ASVERW VARCHAR(80) CHARACTER SET WIN1252,
    ZSTERM VARCHAR(80) CHARACTER SET WIN1252,
    ZSVIDEO VARCHAR(20) CHARACTER SET WIN1252,
    ZSABBILDUNG VARCHAR(20) CHARACTER SET WIN1252,
    ASVIDEO VARCHAR(20) CHARACTER SET WIN1252,
    ASABBILDUNG VARCHAR(20) CHARACTER SET WIN1252,
    PROJ VARCHAR(20) CHARACTER SET WIN1252,
    ASDEF BLOB SUB_TYPE 1 SEGMENT SIZE 4096 CHARACTER SET WIN1252,
    ASAUDIO VARCHAR(20) CHARACTER SET WIN1252,
    REV VARCHAR(1) CHARACTER SET WIN1252,
    ASSEM VARCHAR(80) CHARACTER SET WIN1252,
    ASPRGM VARCHAR(20) CHARACTER SET WIN1252,
    ASABK VARCHAR(10) CHARACTER SET WIN1252,
    ASTERM VARCHAR(80) CHARACTER SET WIN1252,
    ID BIGINT)
AS
begin
  for
    select first 20 d.id, d.asterm, d.asabk, d.asprgm, d.assem, d.zsterm,
    d.zsabk, d.zsprgm, d.zssem, d.datum, d.proj, d.rev, d.upddatum, d.asdef,
    d.zsdef, d.asaudio, d.asvideo, d.asabbildung, d.zsabbildung, d.zsaudio,
    d.zsvideo, asmain.asterm, zsmain.zsterm, a.aut, ua.aut,
    aslit.qcode, zslit.qcode
    from dicentries d
    left join dicentries asmain on d.asverw = asmain.id
    left join dicentries zsmain on d.zsverw = zsmain.id
    left join aut a on d.aut = a.id
    left join aut ua on d.updaut = ua.id
    left join lit aslit on d.asqcode = aslit.id
    left join lit zslit on d.zsqcode = zslit.id
    where d.id > :id order by d.id
    into :id, :asterm, :asabk, :asprgm, :assem, :zsterm, :zsabk, :zsprgm,
    :zssem, :datum, :proj, :rev, :upddatum, :asdef, :zsdef, :asaudio, :asvideo,
    :asabbildung, :zsabbildung, :zsaudio, :zsvideo, :asverw, :zsverw, :aut,
    :updaut, :asqcode, :zsqcode
   do
  suspend;
end
^

SET TERM ; ^

mkinzler 19. Mai 2006 20:41

Re: sp lässt sich nicht erstellen
 
Du hast 2 parameter mit dem selben Namen. Bennene mal den ID-Eibgabeparameter z.B. in IDein um. Dann gehts.

sancho1980 19. Mai 2006 21:44

Re: sp lässt sich nicht erstellen
 
ah, ok, danke ...

und jetz schon das nächste problem: kann es sein, dass ich "union" in einer sp nicht verwenden kann?

jedenfalls funktioniert keins der beiden:

SQL-Code:
SET TERM ^ ;

CREATE PROCEDURE GET_NEXT_20_DICENTRIES_BY_ID (
    IDINPUT BIGINT)
RETURNS (
    DATUM DATE,
    AUT VARCHAR(3),
    ZSDEF BLOB SUB_TYPE 1 SEGMENT SIZE 4096,
    ZSSEM VARCHAR(80),
    UPDAUT VARCHAR(3),
    ZSQCODE VARCHAR(15),
    ZSPRGM VARCHAR(20),
    ASQCODE VARCHAR(15),
    ZSVERW VARCHAR(80),
    ZSABK VARCHAR(10),
    UPDDATUM DATE,
    ZSAUDIO VARCHAR(20),
    ASVERW VARCHAR(80),
    ZSTERM VARCHAR(80),
    ZSVIDEO VARCHAR(20),
    ZSABBILDUNG VARCHAR(20),
    ASVIDEO VARCHAR(20),
    ASABBILDUNG VARCHAR(20),
    PROJ VARCHAR(20),
    ASDEF BLOB SUB_TYPE 1 SEGMENT SIZE 4096,
    ASAUDIO VARCHAR(20),
    REV VARCHAR(1),
    ASSEM VARCHAR(80),
    ASPRGM VARCHAR(20),
    ASABK VARCHAR(10),
    ASTERM VARCHAR(80),
    ID BIGINT)
AS
begin
  for
    select first 20 d.id, d.asterm, d.asabk, d.asprgm, d.assem, d.zsterm,
    d.zsabk, d.zsprgm, d.zssem, d.datum, d.proj, d.rev, d.upddatum, d.asdef,
    d.zsdef, d.asaudio, d.asvideo, d.asabbildung, d.zsabbildung, d.zsaudio,
    d.zsvideo, asmain.asterm, zsmain.zsterm, a.aut, ua.aut,
    aslit.qcode, zslit.qcode
    from dicentries d
    left join dicentries asmain on d.asverw = asmain.id
    left join dicentries zsmain on d.zsverw = zsmain.id
    left join aut a on d.aut = a.id
    left join aut ua on d.updaut = ua.id
    left join lit aslit on d.asqcode = aslit.id
    left join lit zslit on d.zsqcode = zslit.id
    where d.id > :idinput order by d.id
    into :id, :asterm, :asabk, :asprgm, :assem, :zsterm, :zsabk, :zsprgm,
    :zssem, :datum, :proj, :rev, :upddatum, :asdef, :zsdef, :asaudio, :asvideo,
    :asabbildung, :zsabbildung, :zsaudio, :zsvideo, :asverw, :zsverw, :aut,
    :updaut, :asqcode, :zsqcode

    union

    select first 20 d.id, d.asterm, d.asabk, d.asprgm, d.assem, d.zsterm,
    d.zsabk, d.zsprgm, d.zssem, d.datum, d.proj, d.rev, d.upddatum, d.asdef,
    d.zsdef, d.asaudio, d.asvideo, d.asabbildung, d.zsabbildung, d.zsaudio,
    d.zsvideo, asmain.asterm, zsmain.zsterm, a.aut, ua.aut,
    aslit.qcode, zslit.qcode
    from dicentries d
    left join dicentries asmain on d.asverw = asmain.id
    left join dicentries zsmain on d.zsverw = zsmain.id
    left join aut a on d.aut = a.id
    left join aut ua on d.updaut = ua.id
    left join lit aslit on d.asqcode = aslit.id
    left join lit zslit on d.zsqcode = zslit.id
    where d.id < :idinput order by d.id
    into :id, :asterm, :asabk, :asprgm, :assem, :zsterm, :zsabk, :zsprgm,
    :zssem, :datum, :proj, :rev, :upddatum, :asdef, :zsdef, :asaudio, :asvideo,
    :asabbildung, :zsabbildung, :zsaudio, :zsvideo, :asverw, :zsverw, :aut,
    :updaut, :asqcode, :zsqcode


   do
  suspend;
end^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE GET_NEXT_20_DICENTRIES_BY_ID TO SYSDBA;

SET TERM ^ ;

SQL-Code:
CREATE PROCEDURE GET_NEXT_20_DICENTRIES_BY_ID (
    IDINPUT BIGINT)
RETURNS (
    DATUM DATE,
    AUT VARCHAR(3),
    ZSDEF BLOB SUB_TYPE 1 SEGMENT SIZE 4096,
    ZSSEM VARCHAR(80),
    UPDAUT VARCHAR(3),
    ZSQCODE VARCHAR(15),
    ZSPRGM VARCHAR(20),
    ASQCODE VARCHAR(15),
    ZSVERW VARCHAR(80),
    ZSABK VARCHAR(10),
    UPDDATUM DATE,
    ZSAUDIO VARCHAR(20),
    ASVERW VARCHAR(80),
    ZSTERM VARCHAR(80),
    ZSVIDEO VARCHAR(20),
    ZSABBILDUNG VARCHAR(20),
    ASVIDEO VARCHAR(20),
    ASABBILDUNG VARCHAR(20),
    PROJ VARCHAR(20),
    ASDEF BLOB SUB_TYPE 1 SEGMENT SIZE 4096,
    ASAUDIO VARCHAR(20),
    REV VARCHAR(1),
    ASSEM VARCHAR(80),
    ASPRGM VARCHAR(20),
    ASABK VARCHAR(10),
    ASTERM VARCHAR(80),
    ID BIGINT)
AS
begin
  for
    select first 20 d.id, d.asterm, d.asabk, d.asprgm, d.assem, d.zsterm,
    d.zsabk, d.zsprgm, d.zssem, d.datum, d.proj, d.rev, d.upddatum, d.asdef,
    d.zsdef, d.asaudio, d.asvideo, d.asabbildung, d.zsabbildung, d.zsaudio,
    d.zsvideo, asmain.asterm, zsmain.zsterm, a.aut, ua.aut,
    aslit.qcode, zslit.qcode
    from dicentries d
    left join dicentries asmain on d.asverw = asmain.id
    left join dicentries zsmain on d.zsverw = zsmain.id
    left join aut a on d.aut = a.id
    left join aut ua on d.updaut = ua.id
    left join lit aslit on d.asqcode = aslit.id
    left join lit zslit on d.zsqcode = zslit.id
    where d.id > :idinput order by d.id

    union

    select first 20 d.id, d.asterm, d.asabk, d.asprgm, d.assem, d.zsterm,
    d.zsabk, d.zsprgm, d.zssem, d.datum, d.proj, d.rev, d.upddatum, d.asdef,
    d.zsdef, d.asaudio, d.asvideo, d.asabbildung, d.zsabbildung, d.zsaudio,
    d.zsvideo, asmain.asterm, zsmain.zsterm, a.aut, ua.aut,
    aslit.qcode, zslit.qcode
    from dicentries d
    left join dicentries asmain on d.asverw = asmain.id
    left join dicentries zsmain on d.zsverw = zsmain.id
    left join aut a on d.aut = a.id
    left join aut ua on d.updaut = ua.id
    left join lit aslit on d.asqcode = aslit.id
    left join lit zslit on d.zsqcode = zslit.id
    where d.id < :idinput order by d.id
    into :id, :asterm, :asabk, :asprgm, :assem, :zsterm, :zsabk, :zsprgm,
    :zssem, :datum, :proj, :rev, :upddatum, :asdef, :zsdef, :asaudio, :asvideo,
    :asabbildung, :zsabbildung, :zsaudio, :zsvideo, :asverw, :zsverw, :aut,
    :updaut, :asqcode, :zsqcode


   do
  suspend;
end^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE GET_NEXT_20_DICENTRIES_BY_ID TO SYSDBA;

sancho1980 19. Mai 2006 21:45

Re: sp lässt sich nicht erstellen
 
ja dumme frage, sorry...das order by id kommt erst zum schluss, sorry!

mkinzler 19. Mai 2006 21:46

Re: sp lässt sich nicht erstellen
 
Ersetze die UNION einfach durch 2 Abfragen in Folge

sancho1980 19. Mai 2006 21:51

Re: sp lässt sich nicht erstellen
 
hmmm...jetz bin ich durcheinander

merk grad, dass es zwar kompiliert, aber nicht das gewünschte ergebnis bringt

das mit den zwei abfragen in folge: geht das? ich meine, am ende will ich ja die vereinigung der beiden mengen in meinem tibdataset haben..und zwar gleichzeitig..

mkinzler 19. Mai 2006 21:57

Re: sp lässt sich nicht erstellen
 
Ja, man kann in einer SP einfach mehrere Abfragen in Folge mäachen.

SQL-Code:
For select ... into do
begin
  ...
  supend;
end
For select ... into do
begin
  ...
  supend;
end

sancho1980 19. Mai 2006 22:06

Re: sp lässt sich nicht erstellen
 
du meinst so?

SQL-Code:
begin
  for
    select first 20 d.id, d.asterm, d.asabk, d.asprgm, d.assem, d.zsterm,
    d.zsabk, d.zsprgm, d.zssem, d.datum, d.proj, d.rev, d.upddatum, d.asdef,
    d.zsdef, d.asaudio, d.asvideo, d.asabbildung, d.zsabbildung, d.zsaudio,
    d.zsvideo, asmain.asterm, zsmain.zsterm, a.aut, ua.aut,
    aslit.qcode, zslit.qcode
    from dicentries d
    left join dicentries asmain on d.asverw = asmain.id
    left join dicentries zsmain on d.zsverw = zsmain.id
    left join aut a on d.aut = a.id
    left join aut ua on d.updaut = ua.id
    left join lit aslit on d.asqcode = aslit.id
    left join lit zslit on d.zsqcode = zslit.id
    where d.id > :idinput order by d.id ascending
    into :id, :asterm, :asabk, :asprgm, :assem, :zsterm, :zsabk, :zsprgm,
    :zssem, :datum, :proj, :rev, :upddatum, :asdef, :zsdef, :asaudio, :asvideo,
    :asabbildung, :zsabbildung, :zsaudio, :zsvideo, :asverw, :zsverw, :aut,
    :updaut, :asqcode, :zsqcode
   do
  suspend;
  for
    select first 20 d.id, d.asterm, d.asabk, d.asprgm, d.assem, d.zsterm,
    d.zsabk, d.zsprgm, d.zssem, d.datum, d.proj, d.rev, d.upddatum, d.asdef,
    d.zsdef, d.asaudio, d.asvideo, d.asabbildung, d.zsabbildung, d.zsaudio,
    d.zsvideo, asmain.asterm, zsmain.zsterm, a.aut, ua.aut,
    aslit.qcode, zslit.qcode
    from dicentries d
    left join dicentries asmain on d.asverw = asmain.id
    left join dicentries zsmain on d.zsverw = zsmain.id
    left join aut a on d.aut = a.id
    left join aut ua on d.updaut = ua.id
    left join lit aslit on d.asqcode = aslit.id
    left join lit zslit on d.zsqcode = zslit.id
    where d.id < :idinput order by d.id descending
    into :id, :asterm, :asabk, :asprgm, :assem, :zsterm, :zsabk, :zsprgm,
    :zssem, :datum, :proj, :rev, :upddatum, :asdef, :zsdef, :asaudio, :asvideo,
    :asabbildung, :zsabbildung, :zsaudio, :zsvideo, :asverw, :zsverw, :aut,
    :updaut, :asqcode, :zsqcode
   do
  suspend;
end
korrektur: da bekomm ich tatsächlich 40 datensätze...aber wie kann ich dem klar machen, dass ich die vereinigung auf jeden fall nach d.id aufsteigend sortiert will...passiert zwar standardmäßig aber man kann ja nie wissen, oder?

mkinzler 19. Mai 2006 22:10

Re: sp lässt sich nicht erstellen
 
Zitat:

außerdem is mir nicht klar, wie ich der procedure klar machen soll, dass ich die die datensätze der ersten abfrage nach d.id aufsteigend sortiert haben will, die der zweiten nach d.id absteigend
Einfach in den Abfragen.
Bei jedem suspend wird der aktuelle Inhalt der (Ausgabe-)Variabeln in die Ergebnismenge geschrieben.
Zitat:

und die vereinigung des ganzen dann wieder aufsteigend sortiert haben will
Diese Sortierung könntest du in der Abfrage auf die SP machen, würde aber die Sortierung in der SP aufheben.

sancho1980 19. Mai 2006 22:13

Re: sp lässt sich nicht erstellen
 
ahhh, verstehe, danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:08 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