В Oracle в чем разница между открытием и открытием курсора с параметрами? - PullRequest
7 голосов
/ 23 февраля 2010

В чем разница между этими двумя частями кода?

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;

И ...

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

OPEN presf_cur(p_subscriber_id);

Кажется, они оба работают. Они одинаковые или есть какая-то разница, о которой я должен знать?

Ответы [ 2 ]

6 голосов
/ 23 февраля 2010

Второй пример - явный курсор, и он статический. То есть это переменная, связанная с одним оператором SQL. Существует неявный эквивалент ...

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

Первый пример - это курсор ref, который является указателем на оператор SQL и поэтому может быть динамическим. Например, мы можем расширить этот пример следующим образом:

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;

Или даже:

    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;

Таким образом, использование курсора ref дает нам намного больший контроль над последним оператором SQL, который выполняется. Другое отличие состоит в том, что, поскольку ref-курсор является указателем, он может передаваться между программами. Это очень полезно для передачи данных из PL / SQL на другие языки, например, набор результатов JDBC.

5 голосов
/ 23 февраля 2010
  1. Строго типизированные курсоры могут быть «описаны».
  2. Если ваше здание API (пакет) вы можете разместить свой определения курсора на уровень спецификации и дать клиент-программист лучшее чувство что делает и возвращает ваш API без необходимости знать о исходный код.
  3. Инструменты Layout / IDE / GUI скорее всего, будет играть лучше с курсор.
  4. Возможно, незначительный выигрыш в производительности при наличии известного типизированного курсора; но я бы не рассчитывал, что это что-то значимое.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...