AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi sp lässt sich nicht erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

sp lässt sich nicht erstellen

Ein Thema von sancho1980 · begonnen am 19. Mai 2006 · letzter Beitrag vom 19. Mai 2006
Antwort Antwort
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#1

sp lässt sich nicht erstellen

  Alt 19. Mai 2006, 20:23
Datenbank: firebird 1.5 • Zugriff über: ibx, ibexpert
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 ; ^
Angehängte Dateien
Dateityp: rar dm_872.rar (74,3 KB, 4x aufgerufen)
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: sp lässt sich nicht erstellen

  Alt 19. Mai 2006, 20:41
Du hast 2 parameter mit dem selben Namen. Bennene mal den ID-Eibgabeparameter z.B. in IDein um. Dann gehts.
Markus Kinzler
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#3

Re: sp lässt sich nicht erstellen

  Alt 19. Mai 2006, 21:44
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;
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#4

Re: sp lässt sich nicht erstellen

  Alt 19. Mai 2006, 21:45
ja dumme frage, sorry...das order by id kommt erst zum schluss, sorry!
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: sp lässt sich nicht erstellen

  Alt 19. Mai 2006, 21:46
Ersetze die UNION einfach durch 2 Abfragen in Folge
Markus Kinzler
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#6

Re: sp lässt sich nicht erstellen

  Alt 19. Mai 2006, 21:51
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..
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: sp lässt sich nicht erstellen

  Alt 19. Mai 2006, 21:57
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
Markus Kinzler
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#8

Re: sp lässt sich nicht erstellen

  Alt 19. Mai 2006, 22:06
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?
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: sp lässt sich nicht erstellen

  Alt 19. Mai 2006, 22:10
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.
Markus Kinzler
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#10

Re: sp lässt sich nicht erstellen

  Alt 19. Mai 2006, 22:13
ahhh, verstehe, danke!
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 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