2015-09-02 2 views
0

У меня есть пакет PL/SQL, где я хочу объявить select-statment, который используется другими другими пакетами. Поэтому я вижу пути. Сначала я определяю курсор, который можно вызвать из других пакетов, и сохранить выбранный. Второй способ - это процедура, которая хранит выбор.Oracle: Использование процедуры или курсора для хранения Select-Statement?

Может ли кто-нибудь сказать мне о преимуществах и недостатках каждого способа? Мой профессор говорит, что Курсор - старый и состоятельный, и никто не использует это сегодня. Мой шеф-повар говорит мне, что курсор быстрее итерации, и вы можете создавать его типы.

Может ли кто-нибудь сказать мне, что является лучшей практикой здесь?

Например:

CURSOR crs_active_customer IS 
SELECT * FROM customer where status = 'active' 

ИЛИ

PROCEDURE prc_getActiveCustomer IS 
BEGIN 
SELECT * FROM customer where status = 'active'; 
END prc_getActiveCustomer; 

Что лучший способ сохранить выбор-заявления.

+3

Найти лучшего профессора. – booyaa

+0

Хорошее чтение: http://explainextended.com/2009/06/28/the-island-of-misfit-cursors/ – Rene

+0

В терминологию легко смешивать. Чтобы убедиться, что мы понимаем ваш вопрос, было бы полезно, если бы вы предоставили образец SQL, PL/SQL, чтобы проиллюстрировать оба параметра, которые вы пытаетесь сравнить. – sstan

ответ

0

PL/SQL 101 на помощь! От Working with Cursors:

Главная цель языка Oracle PL/SQL, чтобы сделать его максимально простым и эффективным, как можно запрашивать и изменять содержимое таблиц в базе данных. Разумеется, вы должны использовать язык SQL для доступа к таблицам, и каждый раз, когда вы это делаете, вы используете курсор , чтобы выполнить эту работу.

Таким образом, каждый раз, когда у вас есть SQL в PL/SQL, будет курсор. Следующий вопрос - какие существуют курсоры и когда их использовать. В вышеупомянутой статье затрагивается и эта тема.

Вы также можете прочитать точную инструкцию: Cursors

курсора является указателем на частную область SQL, которая хранит информацию об обработке конкретного SELECT, или DML заявления.

И затем продолжайте чтение о неявных и явных курсорах.

Далее найдите лучшего профессора.

1

Я бы написал функцию, которая возвращает новый экземпляр курсора каждый раз, когда вы его вызываете. Переменная курсора в пакете на самом деле является GLOBAL-переменной: вы можете использовать только одну процедуру за раз, используя ее. Вероятно, это проблема, о которой говорит ваш профессор.

Наличие глобального курсора означает, что вы столкнетесь с ошибками «курсор уже открыт», если вы напишете процедуру, которая при сканировании результатов такого курсора вызывает другую функцию, которая внутренне должна использовать тот же самый курсор.

Смежные вопросы