WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Советы » Использование SQL с другим языком (вложенный SQL). Модифицирование курсоров

Использование SQL с другим языком (вложенный SQL). Модифицирование курсоров


Дата публикации: 12-07-2008

Курсоры могут также быть использованы, чтобы выбирать группу строк из таблицы, которые могут быть затем модифицированы или удалены одна за другой. Это дает вам возможность, обходить некоторые ограничения предикатов используемых в командах UPDATE и DELETE. Вы можете ссылать- ся на таблицу задействованную в предикате запроса курсора или любом из его подзапросов, которые вы не можете выполнить в предикатах самих этих команд. Как подчеркнуто в Главе 16, стандарт SQL отклоняет попыт- ку удалить всех пользователей с рейтингом ниже среднего, в следующей форме:

 

EXEC SQL DELETE FROM Customers

WHERE rating <

( SELECT AVG (rating)

FROM Customers);

 

Однако, вы можете получить тот же эффект, используя запрос для выбора соответствующих строк, запомнив их в курсоре, и выполнив DELETE с ис- пользованием курсора. Сначала вы должны обьявить курсор:

 

EXEC SQL DECLARE Belowavg CURSOR FOR

SELECT * FROM Customers

WHERE rating < (SELECT AVG (rating)

FROM Customers);

 

Затем вы должны создать цикл, чтобы удалить всех заказчиков выбранных курсором:

 

EXEC SQL WHENEVER SQLERROR GOTO Error_handler;

EXEC SQL OPEN CURSOR Belowavg;

while not SOLCODE = 100 do

begin

EXEC SOL FETCH Belowavg INTO :a, :b, :c, :d, :e;

EXEC SOL DELETE FROM Customers

WHERE CURRENT OF Belowavg;

end;

EXEC SOL CLOSE CURSOR Belowavg;

 

Предложение WHERE CURRENT OF означает что DELETE применяется к стро- ке которая в настоящее время выбрана курсором. Здесь подразумевается, что и курсор и команда DELETE, ссылаются на одну и ту же таблицу, и следовательно, что запрос в курсоре - это не обьединение. Курсор должен также быть модифицируемым. Являясь модифицируемым, курсор должен удовлетворять тем же условиям что и представления ( см. Главу 21 ). Кроме того, ORDER BY и UNION, которые не разрешены в представлениях, в курсорах - разрешаются, но предохраняют курсор от модифицируемости. Обратите внимание в вышеупомянутом примере, что мы должны выбирать строки из курсора в набор переменных, даже если мы не собирались использовать эти переменные. Этого требует синтаксис коман- ды FETCH. UPDATE работает так же. Вы можете увеличить значение комис- сионных всем продавцам, которые имеют заказчиков с оценкой=300, следу- ющим способом.

Сначала вы обьявляете курсор:

 

EXEC SOL DECLARE CURSOR High_Cust AS

SELECT *

FROM Salespeople

WHERE snum IN (SELECT snum

FROM Customers

WHERE rating = 300);

 

Затем вы выполняете модификации в цикле:

EXEC SQL OPEN CURSOR High_cust;

while SQLCODE = 0 do

begin

EXEC SOL FETCH High_cust

INTO :id_num, :salesperson, :loc, :comm;

EXEC SQL UPDATE Salespeople SET comm = comm + .01

WHERE CURRENT OF High_cust; end;

EXEC SQL CLOSE CURSOR High_cust;

 

Обратите внимание: что некоторые реализации требуют, чтобы вы указы- вали в определении курсора, что курсор будет использоваться для выпол- нения команды UPDATE на определенных столбцах. Это делается с помощью заключительной фразы определения курсора - FOR UPDATE . Чтобы обьявить курсор High_cust таким способом, так чтобы вы могли мо- дифицировать командой UPDATE столбец comm, вы должны ввести следующее предложение:

 

EXEC SQL DECLARE CURSOR High_Cust AS

SELECT *

FROM Salespeople

WHERE snum IN

(SELECT snum

FROM Customers

WHERE rating = 300)

FOR UPDATE OF comm;

 

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

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)
Ноябрь 2015 (1)
Октябрь 2015 (1)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта

Хотите продать свой сайт?
- Мы быстро и удобно для Вас сможем его купить:
  • Заявка на продажу сайта
  • Раcсматриваем цены на каждый сайт в индивидуальном порядке.

    Случайная цитата

    E. W. Dijkstra:

    "Использование COBOL калечит разум; исходя из этого, обучение этому языку должно быть признано уголовно наказуемым преступлением."

    Опрос

    Какой аудио плеер Вы используете?

    Winamp
    Light Alloy
    foobar2000
    Apollo
    AIMP
    1by1
    iTunes
    jetAudio
    Другой...