Как зациклить в sql? - PullRequest
       1

Как зациклить в sql?

0 голосов
/ 07 сентября 2011

Я не хочу использовать ключевое слово, связанное с "loop", как я могу реализовать цикл с базовой командой sql в oracle?
У меня есть два стола:

A:  
ID, Color    
B,   
ID, AID, Type  

Я хочу зациклить все записи в B, и если ID = AID, то установить A.Color = B.Type
Заранее спасибо!

Ответы [ 5 ]

9 голосов
/ 07 сентября 2011

Цикл по определению является процедурной конструкцией.

SQL декларативен: скажите базе данных, что вы хотите сделать, а не как это сделать.

Если вы абсолютно уверены, что вам нужно программировать такую ​​вещь, то напишите ее на PL/ SQL, процедурный язык Oracle.

Bu Я уверен, что в SQL можно делать то, что вы хотите, используя UPDATE с предложением WHERE.

Примерно так (исправлено в соответствии с NullUserException):

UPDATE A SET A.Color = (SELECT B.Type FROM B WHERE A.ID = B.AID)
4 голосов
/ 07 сентября 2011

Альтернативный метод:

MERGE INTO a
USING b
ON (b.aid = a.id)
WHEN MATCHED THEN UPDATE SET a.color = b.type;
4 голосов
/ 07 сентября 2011

Вы можете просто сделать:

UPDATE tablea a
   SET a.color = (SELECT b.type 
                    FROM tableb b
                   WHERE b.aid = a.id)

См. этот сценарий SQL .

0 голосов
/ 03 марта 2012

Как уже отмечали другие, вы, вероятно, можете решить свою проблему с помощью обычного оператора DML, без каких-либо циклов. Но чтобы дать вам некоторые основы о том, как выполнить то, что вы просили в PL / SQL, вот пример ...

DECLARE
    CURSOR c IS 
        SELECT id, aid, type FROM b;
    statement VARCHAR2(200);
BEGIN
    FOR iterator IN c LOOP
        IF iterator.id = iterator.aid THEN
            statement := 'UPDATE a SET color = ' || iterator.type || 'WHERE id = ' || iterator.id;
            EXECUTE IMMEDIATE statement;
        END IF;
    END LOOP;
END;

Этот анонимный PL / SQL-блок будет перебирать каждую запись в таблице b, а если b.id = b.aid, он будет обновлять таблицу a и устанавливать a.color = b.type, где a.id = b.id .

Кажется, это то, что вы просили. Это не совсем эффективный способ сделать что-то, так как вы запускаете один оператор DML на строку в таблице b с b.id = b.aid. Но я хотел больше привести это в качестве примера синтаксиса. Кстати, это всего лишь один способ перебора курсора; Вы также можете явно открывать курсоры и извлекать записи, но так проще, если вам не нужно ничего делать, кроме как перебирать весь набор результатов.

0 голосов
/ 07 сентября 2011

Для этого вам нужно написать хранимую процедуру, используя PL / SQL. Здесь - страница оракула с информацией и статьями по теме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...