Если я правильно понимаю, временная таблица должна автоматически удаляться в конце сеанса. Но после того, как моя хранимая процедура заканчивается, временная таблица все еще существует. Кто-нибудь знает, как использовать таблицу tmp? Заранее спасибо.
Временная таблица не удаляется в конце сеанса
Ответы (2)
temp table
существует на время вашего сеанса. Поэтому, если вы создадите временную таблицу в stored proc
и все еще находитесь в том же сеансе, temp table
все равно будет там. Я бы рекомендовал удалить таблицу в хранимой процедуре. Другие RDBMS
, такие как SQL Server
, позволяют таблице существовать как переменная, которая звучит как то, что вы хотите.
Как правило, таблица Temp очищается после завершения автономной процедуры.
Однако, если мы вызываем процедуру внутри цикла, она ведет себя как single session
на протяжении всех итераций.
Следовательно, это то же самое, что создавать одну и ту же временную таблицу снова и снова, не удаляя ее.
Лучше использовать "удаляемую таблицу" всякий раз, когда мы используем временные таблицы внутри процедуры. Повтор не повлияет.
пример :
FOR v_cnt IN SELECT load_dt AS history_date FROM process_dates ORDER BY history_date ASC
LOOP
CALL sp_Logic(v_Record.history_date, 'ALL');
END LOOP;
sp_Logic(v_Record.history_date, 'ALL');
Процедура:
CREATE OR REPLACE PROCEDURE sp_Logic"(DATE, CHARACTER VARYING(ANY))
RETURNS CHARACTER VARYING(ANY) EXECUTE AS CALLER
LANGUAGE NZPLSQL AS
BEGIN_PROC
DECLARE
...
..
..
v_Curr_Step := 'Populate ref_id';
CREATE TEMP TABLE TEMP_REFID_1 AS
(SELECT * FROM ref_id) ;
..
..
EXCEPTION
WHEN OTHERS
THEN
RAISE EXCEPTION 'CAUGHT EXCEPTION WHILE % : %', v_Curr_Step, SQLERRM;
END;
END_PROC;
Этот код создаст проблему, когда запрос SELECT load_dt AS history_date FROM process_date вернет более одной даты.
Я не уверен, что приведенное выше объяснение имеет смысл. Я старался :-)