Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

firebird 1.5 dwa pytanka

10 views
Skip to first unread message

Maciej Jurkiewicz

unread,
Dec 20, 2009, 2:57:30 PM12/20/09
to
hello.
mam taka procedure:

SET TERM ^ ;

CREATE OR ALTER PROCEDURE ZLECENIA_PACJENTA (
pacjent_id integer)
returns (
result varchar(10) character set win1250)
as
declare variable id_zlecenia integer;
begin

for select id from zlecenia where pacjent=:pacjent_id into :id_zlecenia
do
begin
if(id_zlecenia is null) then RESULT='NIE MA';
ELSE RESULT='MA';
suspend;
end
end^

SET TERM ; ^
GRANT SELECT ON ZLECENIA TO PROCEDURE ZLECENIA_PACJENTA;
GRANT EXECUTE ON PROCEDURE ZLECENIA_PACJENTA TO SYSDBA

1.
procedura pobiera jako argument id pacjenta (np z tabeli pacjenci) i sprawdza
czy w tabeli zlecenia istnieje pacjent o pobranym id.
Jezeli jest to zwraca 'MA' natomiast jezeli nie ma zwraca null,dlaczego?
Myslalem ze zwroci 'NIE MA'?

2.
jak w ibexpert (lub isqlu) zrobie select * from zlecenia_pacjenta('12345678');
to widzi mi te procedure zwraca wartosc
natomiast
jak zrobie select zlecenia_pacjenta(pacjent) from zlecenia;
to otrzymuje: "SQL error code = -804. Function unknown."
dlaczego? przeciez widze ja w procedurach?

co robie zle?
pozdr. mj

Sławomir Szyszło

unread,
Dec 20, 2009, 3:22:44 PM12/20/09
to
Dnia 2009-12-20 20:57, U�ytkownik Maciej Jurkiewicz napisa�:

A od kiedy p�tla typu FOR wykonuje si�, gdy warunek jest fa�szywy? Skoro nie
znajduje rekordu spe�niaj�cego kryteria, to zawarto�� p�tli si� nigdy nie
wykona. Ustaw RESULT przed p�tl�.

--
S�awomir Szysz�o
Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych
FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/
Archiwum http://groups.google.com/groups?group=pl.comp.bazy-danych

Maciej Jurkiewicz

unread,
Dec 20, 2009, 4:35:29 PM12/20/09
to
hmmm nie wiem czy sie dobrze zrozumielismy.
Chodzi mi o to ze podaje procedurze jako argument id pacjenta
i na podstawie tego id zostaje przeszukana tabela zlecenia.
Jezeli przynajmniej 1 rekord dla tego pacjenta sie znajdzie
to chcialbym zeby procedura zwrocila true, w przeciwnym razie
false.


On 2009-12-20, S�awomir Szysz�o <slas...@CIACHTO.list.pl> wrote:
> Dnia 2009-12-20 20:57, U�ytkownik Maciej Jurkiewicz napisa�:

> A od kiedy p�tla typu FOR wykonuje si�, gdy warunek jest fa�szywy? Skoro nie
> znajduje rekordu spe�niaj�cego kryteria, to zawarto�� p�tli si� nigdy nie
> wykona. Ustaw RESULT przed p�tl�.
>

cut

unread,
Dec 20, 2009, 4:44:22 PM12/20/09
to
W dniu 2009-12-20 22:35, Maciej Jurkiewicz pisze:

> hmmm nie wiem czy sie dobrze zrozumielismy.
> Chodzi mi o to ze podaje procedurze jako argument id pacjenta
> i na podstawie tego id zostaje przeszukana tabela zlecenia.
> Jezeli przynajmniej 1 rekord dla tego pacjenta sie znajdzie
> to chcialbym zeby procedura zwrocila true, w przeciwnym razie
> false.

Zostałeś bardzo dobrze zrozumiany, zastanów się ile przebiegów bedzie
miała pętla for jeżeli select zwróci zero rekordów (petla nie wykona się
wcale tak więc kod zawarty w tej pętli też się nie wykona). Sławomir Sz.
bardzo dobrze Ci odpowiedział, przypisz result przed pętlą.

Pozdrawiam

wloochacz

unread,
Dec 21, 2009, 2:01:08 PM12/21/09
to
Maciej Jurkiewicz pisze:
Poniewa� kod warunkowy zale�ny jest od p�tli, tak jak koledzy napisali.
A poza tym, ten kursor jest tam absolutnie zb�dny i b�dzie
katastrofalnie wp�ywa� na wydajno�� - no chyb, �e piszesz dla NFZ, to
Ciebie to nie interesuje.
Tak czy siak, winno byďż˝ tak:

CREATE OR ALTER PROCEDURE ZLECENIA_PACJENTA (pacjent_id integer)

returns (result varchar(10) character set win1250)
as
begin
if exists(select * from zlecenia where pacjent = :pacjent_id) then
RESULT = 'NIE MA';
else
RESULT = 'MA';

suspend;
end

> Myslalem ze zwroci 'NIE MA'?

Nieprawda - nie da si� my�le� bez zrozumienia tematu. Ty nie rozumiesz.

> 2.
> jak w ibexpert (lub isqlu) zrobie select * from zlecenia_pacjenta('12345678');
> to widzi mi te procedure zwraca wartosc
> natomiast
> jak zrobie select zlecenia_pacjenta(pacjent) from zlecenia;
> to otrzymuje: "SQL error code = -804. Function unknown."
> dlaczego?

Pisa�em wcze�niej, bo nie rozumiesz jak to dzia�a po co i dlaczego tak
nie nale�y robi�.

> przeciez widze ja w procedurach?
> co robie zle?

OIDP, to powinno byďż˝ tak:
select (zlecenia_pacjenta(A.pacjent)) as CzyPacjentMaZlecenia
from zlecenia A

Ale to i tak ten kod jest... dziwny, chodzi mi o wo�anie procedury dla
ka�dego wiersza.

--
wloochacz

0 new messages