sobota, 20 listopada 2010

Kurs Oracle PL/SQL.Pakiety - przeciążanie procedur i funkcji

W jednym pakiecie możemy zdefiniować kilka procedur lub funkcji o identycznych nazwach, jednak muszą one różnić się ilością lub typem parametrów przyjmowanych. Nie można zdefiniować identycznych podprogramów jeśli różnią się jedynie zwracanym typem lub typami parametrów IN, IN OUT i OUT.


W poniższym przykładzie dodałem drugą funkcję „srednia_zarobkow_dzialu” różniącą się tylko jednym parametrem. Dodałem parametr id_managera aby wyświetlać średnie zarobków w danym dziale, obliczane na podstawie zarobków pracowników podległych konkretnemu managerowi w tym dziale.


Następnym krokiem było rozbudowanie części implementacji pakietu o ciało nowej funkcji:
 

Mogę teraz wykorzystać obie wersje funkcji, a to która z nich zostanie użyta zależeć będzie od ilości podanych parametrów:






Ten temat omawiam na poniższych szkoleniach:
• Programowanie w PL/SQL
• Podstawy SQL i PL/SQL
Możesz w nich uczestniczyć, a jako czytelnik tego bloga otrzymasz 10% zniżki - poinformuj o tym fakcie konsultanta.

2 komentarze:

  1. Trafiłem kiedyś na niezrozumiałe zachowanie Oracle 11 Enterprise (nie sprawdzałem tego na innych wersjach) podczas wykonywania kodu odwołującego się do przeciążonych procedur.

    W pakiecie deklaracje wyglądały mniej więcej tak:

    PROCEDURE zrob_cos (p_param varchar2) (...)
    PROCEDURE zrob_cos (p_param DATE) (...)

    Podczas wywołania:

    zrob_cos('')

    dostałem komunikat 'istnieje za dużo procedur spełniających warunek wywołania'. Jednak podczas takiego wywołania:

    zrob_cos(to_date(''))

    została już wywołana procedura z typem argumentu DATE.

    Czy to jest normalne zachowanie? Wszak to_date('') wciąż jest NULL tak samo jak ''.

    OdpowiedzUsuń
  2. Dziwne, ja na swojej wersji zrob_cos('') mam wywolanie procedury z parametrem varchar2 co nie specjalnie mnie dziwi bo '' to nie jest null tylko pusty tekst (wartosc tekstowa o dlugosci 0) co powinno byc odroznione od null. zrob_cos(to_date('')) wiadomo ze wywoluje procedure z parametrem to_date.

    OdpowiedzUsuń