2013-03-16 5 views
1

Я пытаюсь написать заявление SQL PL? Для оракула, который выбирает все уникальное Industries из таблицы (Jobs Table) и вставляет его в другую таблицу под названием dim_industryPL-SQL явных курсоры

DECLARE 
cursor industries is select unique industry from job; 
ind varchar2(20); 

BEGIN 
    open industries; 
    for counter in 1..industries%ROWCOUNT 
    LOOP 
    FETCH industries into ind; 
    insert into dim_industry (IndustryName) values(ind); 
    END LOOP; 
    close industries; 
END; 
/

select unique industry from job 

Выбирает 10 строк, но когда я запускаю pl-sql, он говорит, что вставлена ​​одна строка. Кроме того, когда я делаю запрос

select * from dim_industry 

запрос, таблица остается пустой. Любые идеи относительно того, почему это произойдет?

+0

чувак, если вы делаете этот же случай с коллекциями и массовым сбором, это намного эффективнее yar –

+0

Выполнение этого простого SQL-запроса «insert into ... select ...» было бы лучшим подходом. –

ответ

0

ENDLOOP должен быть записан как END LOOP
UPDATE
Чтобы достичь того, чего вы хотите, вы можете продолжать так:

DECLARE 
    cursor industries is select unique industry from job; 
    ind varchar2(20); 

    BEGIN 
     open industries; 
     LOOP 
     FETCH industries into ind; 
     exit when industries %notfound; 
     insert into dim_industry (IndustryName) values(ind); 
     END LOOP; 
     close industries; 
     commit; 
    END; 
/
+0

спасибо. Теперь работает pl-sql. однако, это не дает мне результат, которого я ожидал. Я изменяю этот вопрос и буду благодарен, если вы снова посмотрите на него. –

+0

@ErnestTambie: см. Обновленный ответ .. –

+0

спасибо, это работает отлично. Просто чтобы подтвердить, в этой строке: выйти, когда отрасли% не обнаружены; У атрибута% notfound есть false, когда вы достигаете конца строк, возвращенных правильно? –

1

пропустить этот шаг:

DECLARE 
    TYPE T_IND IS TABLE of job.industry%TYPE; 
    ind T_IND; 
BEGIN 
    SELECT UNIQUE industry BULK COLLECT INTO ind FROM job; 
    FORALL i IN ind.FIRST..ind.LAST 
     INSERT INTO dim_industry (IndustryName) VALUES (ind(i)); 
    -- don't forget to commit; 
END; 
/
+0

привет, спасибо за ваш ответ, это тоже работает :) –

+1

добро пожаловать! да, это работает и намного быстрее с точки зрения выступлений. – Sebas

+0

-1 для более сложного решения, чем просто с использованием SQL. –

-1

эй я думаю, вы делаете в другом маршруте, который довольно длинный !!! просто попробуйте этого чувака

DECLARE 
    CURSOR c1 
    iS 
    select unique industry from job; 
BEGIN 
    FOR i IN c1 
    LOOP 
    INSERT INTO dim_industry (IndustryName) VALUES 
     (i.industry 
    ); 
    END LOOP; 
    commit; 
END; 
/

если вы используете for loop для курсора, то не нужно указывать open and close, он неявно открывается и закрывается. примечание: если вы хотите обновить или вставить операцию удаления в таблицу, используя курсор, более удобные пользовательские коллекции с объемной операцией, это намного быстрее, чем это.

Это второй способ сделать то же самое;

DECLARE 
temp HR.departments.department_name%type; 
    CURSOR c1 
    iS 
    SELECT DISTINCT d.department_name FROM hr.departments d; 
BEGIN 
    open c1; 
    LOOP 
    fetch c1 into temp; 
    INSERT INTO thiyagu.temp_dep VALUES 
     (temp 
    ); 
     dbms_output.put_line(temp); 
     exit when c1%notfound; 
    END LOOP; 
    close c1; 
    commit; 
END; 
/

это третий и эффективным способом;

DECLARE 

type test_type is table of job.industry%type; 

col test_type; 

BEGIN 
    select unique industry bulk collect into col from job; 
    forall i in col.first..col.last insert into dim_industry values(col(i)); 
    dbms_output.put_line(sql%rowcount); 
    commit; 

END; 
/
+0

Если вы рекомендуете BULK COLLECT/FORALL, вы также должны указать предложение LIMIT и как его использовать. Выполнение массового сбора может легко взорвать вашу память процесса, если ваш выбор возвращает большое количество строк. –

+0

@ Фрэнк Шмитт: очевидно, но в этом случае мы обрабатываем только 10 записей, но я должен поставить! Kk dude –

+0

-1 для более сложного решения, чем просто использовать SQL –

4

Все предыдущие ответы улучшения - и BULK СБОР является очень полезным инструментом. Но вам вообще не нужно использовать PL/SQL для копирования данных. В вашем случае, попробуйте просто с помощью INSERT ... SELECT заявление следующим образом: -

INSERT INTO dim_industry(IndustryName) 
SELECT DISTINCT industry 
FROM job 

PL/SQL является последним средством ИМХО. Я даже реализовал решение ограничения в прямом Oracle SQL!

+1

+1 это, безусловно, самый разумный подход –

+0

спасибо, я не понимал, что вы можете вставить несколько строк через инструкцию select –

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