2010-02-23 11 views
5

Jaka jest różnica między tymi dwoma kawałkami kodu?W Oracle jaka jest różnica między otwartym a otwarciem kursora z parametrami?

TYPE t_my_cursor IS REF CURSOR; 
v_my_cursor t_my_cursor; 
OPEN v_my_cursor FOR SELECT SomeTableID 
     FROM MYSCHEMA.SOMETABLE 
     WHERE SomeTableField = p_parameter; 

I ...

CURSOR v_my_cur(p_parameter VARCHAR2) IS 
SELECT SomeTableID 
FROM MYSCHEMA.SOMETABLE 
WHERE SomeTableField = p_parameter; 

OPEN presf_cur(p_subscriber_id); 

Oboje wydają się działać. Czy są takie same, czy jest jakaś różnica, o której powinienem wiedzieć?

Odpowiedz

6

Drugi przykład to wyraźny kursor i jest statyczny. Oznacza to, że jest to zmienna powiązana z jedną instrukcją SQL. Jest niejawna odpowiednik ...

FOR lrec in (SELECT SomeTableID 
       FROM MYSCHEMA.SOMETABLE 
       WHERE SomeTableField = p_parameter) 
LOOP 
    do_something_with (lrec.sometableid); 
END LOOP; 

Pierwszym przykładem jest ref kursor, który jest wskaźnikiem do SQL i tak może być dynamiczny. Na przykład możemy przedłużyć ten przykład tak:

TYPE t_my_cursor IS REF CURSOR; 
v_my_cursor t_my_cursor; 

... 

if flag = 1 then 
    OPEN v_my_cursor FOR SELECT SomeTableID 
     FROM MYSCHEMA.SOMETABLE 
     WHERE SomeTableField = p_parameter; 
else 
    OPEN v_my_cursor FOR SELECT SomeTableID 
     FROM MYSCHEMA.ANOTHERTABLE 
     WHERE AnotherTableField = p_parameter; 
end if; 

lub nawet:

l_stmt := 'SELECT * FROM your_table WHERE '; 
    if p_parameter is not null then 
     l_stmt := l_stmt ||'id = :1'; 
     open v_my_cursor for l_stmt using p_parameter; 
    else 
     l_stmt := l_stmt ||'created_date > trunc(sysdate)'; 
     open v_my_cursor for l_stmt; 
    end if; 

więc przy użyciu kursora ref daje nam dużo większą kontrolę nad końcowym SQL, który zostanie wykonany. Inna różnica polega na tym, że kursor ref jest wskaźnikiem, który można przekazywać między programami. Jest to bardzo przydatne przy przekazywaniu danych z PL/SQL do innych języków, na przykład zestawu wyników JDBC.

5
  1. Znacznie napisane kursory można "opisać".
  2. Jeśli twój budowanie API (pakiet) można umieścić definicje kursora na poziomie specyfikacji i dać programiście klientowi lepsze poczucie co robi API i powraca bez konieczności należy pamiętać o kod źródłowy.
  3. Narzędzia Layout/IDE/GUI będą prawdopodobnie ładniejsze z nazwanym kursorem .
  4. Prawdopodobna korzyść w zakresie wydajności ma znanego wpisanego kursora; ale nie liczę na to, że będzie to coś znaczącego.
Powiązane problemy