Создание таблицы перед созданием курсора в Oracle - PullRequest
0 голосов
/ 25 декабря 2011

У меня есть процедура PL / SQL, которая создает временную таблицу, а затем извлекает данные из этой временной таблицы с помощью курсоров, обрабатывает данные и затем удаляет временную таблицу.Однако Oracle не позволяет использовать курсор, если таблица не существует в базе данных.

Пожалуйста, помогите мне разобраться с этим.

Ответы [ 2 ]

8 голосов
/ 25 декабря 2011

Ваше утверждение не совсем верно. Вы можете использовать курсор для почти произвольных запросов. Смотрите ниже:

create or replace procedure fooproc
IS
    type acursor is ref cursor;
    mycur  acursor;
    mydate date;
BEGIN
    execute immediate 'create global temporary table footmp (bar date) on commit delete rows';
    execute immediate 'insert into footmp values (SYSDATE)';
    open mycur for 'select * from footmp';
    loop
        fetch mycur into mydate;
        exit when mycur%notfound;
        dbms_output.put_line(mydate);
    end loop;
    close mycur;
    execute immediate 'drop table footmp';
END fooproc;
/

(Подробнее здесь - особенно этот короткий процесс вообще не безопасен, поскольку имя таблицы фиксировано и не зависит от сессии).

Это (довольно) немного уродливо, и я не предлагаю вам использовать это - скорее, вы должны подумать, нужна ли вам вообще временная таблица для конкретной процедуры.

См. эту другую статью :

НЕ создавайте их динамически [временные таблицы], НЕ создавайте их динамически, пожалуйста - НЕ создавайте их динамически.

Не могли бы вы использовать глобальную временную таблицу? Вам вообще нужен временный стол? (т.е. не использует курсор на операторе select, который вы бы использовали для заполнения этой таблицы?)

1 голос
/ 26 декабря 2011

Или, если вы хотите избежать различий между глобальными временными таблицами и «обычными» постоянными таблицами, к которым вы можете привыкнуть (см. Документы Oracle о доступности данных временной таблицы, времени жизни и т. Д.), Просто создайте таблицу первый (nologging). Предполагая, что никто другой не использует эту таблицу, ваша процедура может обрезаться до / после обработки.

...