czwartek, 9 stycznia 2014

Klauzula NOCOPY w PL/SQL

Klauzulę NOCOPY możemy stosować przy parametrach OUT oraz IN OUT . Sprawia ona że wartość przekazana przez parametr nie jest kopiowana (jak to się dzieje domyślnie) a przekazywana jest referencja. To oznacza, że przekazywany jest wskaźnik do obszaru pamięci, a nie wartość jako taka. Efekt jest taki, że zarówno procedura z parametrem jak i blok (lub inna procedura czy funkcja) ją wywołujący działają na TYCH SAMYCH danych, bo chodzi o tą samą przestrzeń w pamięci operacyjnej.





Z jednej strony stosowanie klauzuli NOCOPY może nam pomóc – zwłaszcza przy przekazywaniu przez parametr typu OUT dużych wartości np. długich tablic albo dużych obiektów. Z drugiej strony, jeśli np. w procedurze nastąpi jakiś wyjątek, to w naszej przekazanej zmiennej może znaleźć się coś innego niż byśmy się spodziewali. Poniżej przedstawiam przykład takiej sytuacji:





Jak widzimy, w wyniku wywołanego wyjątku, przetwarzanie w procedurze nie dobiegło do końca. W efekcie w zmiennej y bloku wywołującego znalazł się tekst „W trakcie przetwarzania” zamiast „Oryginalny oryginał”

1 komentarz:

  1. A co będzie jeśli nie użyjemy klauzuli NO COPY w przytoczonym przykładzie? (I dlaczego) Na moje - niezbyt wyrobione - wyczucie NO COPY przy OUT nie powinno nic zmienić - oczywiście poza zmienioną obsługą pamięci.
    Czy po przejściu do obsługi wyjątku nie jest zwracana zmienna?
    Rozumiał bym gdyby wyjątek nie był obsługiwany w pełni wewnątrz procedury,

    PS Dziś pierwszy raz przeglądam Twój blog, więc jeśli gdzieś (dokładnie) omówiłeś sposoby przekazywania parametrów, to przepraszam za zawracanie głowy.

    OdpowiedzUsuń