Последовательность и переменная привязки

Тарасенков Максим
Дата: 13.03.2011 22:42:36
Всем добрый день.
Имеется вот такая процедура

CREATE OR REPLACE PROCEDURE change_log_insert (comments VARCHAR2) AS
PRAGMA AUTONOMOUS_TRANSACTION;
   ch_id INTEGER;
   ch_date change_log.change_date%type;
   cmnts change_log.comments%type;
   BEGIN
      ch_id := change_log_seq.currval;
      SELECT current_timestamp INTO ch_date FROM DUAL;
      cmnts := comments;
      EXECUTE IMMEDIATE 'INSERT INTO change_log (change_id,change_date,comments) 
      VALUES (:ch_id,:ch_date,:cmnts)' USING ch_id,ch_date,cmnts;
   COMMIT;
EXCEPTION
   WHEN OTHERS THEN
   ROLLBACK;
END change_log_insert;

Подскажите, пожалуйста, как передать последовательность в переменную привязки, чтобы можно было ее использовать в insert, вместо того, чтобы подставлять туда ее значение. Проблема возникает на этапе инициализации переменной привязки, которой должна присваиваться последовательность.

Заранее спасибо.
AmKad
Дата: 13.03.2011 22:45:50
Тарасенков Максим,

А почему бы не обойтись Static SQL?
comphead
Дата: 13.03.2011 22:49:14
Тарасенков Максим,

тут динамика не нужна.
Тарасенков Максим
Дата: 13.03.2011 22:50:58
Потому что это просто процедурка для тренировки. Чтобы попробовать разные вкусные фичи, посмотреть как они работают.
Это моя первая программа на PL/SQL.
Но вот я застрял с этой проблемкой. Использовать переменные привязки нужно почти всегда, вот и хочется понять, что я делаю не так.
Тарасенков Максим
Дата: 13.03.2011 23:21:12
Ну так что, сможет кто-нибудь мне помочь с моим вопросом?
Вячеслав Любомудров
Дата: 14.03.2011 02:55:08
Тарасенков Максим
      ch_id := change_log_seq.currval;
      SELECT current_timestamp INTO ch_date FROM DUAL;
Значение последовательности присваивать напрямую можно только начиная с 11g
SELECT change_log_seq.currval, current_timestamp INTO ch_id, ch_date FROM DUAL;
wurdu
Дата: 14.03.2011 03:45:46
В 11g автор скорее всего получит ORA-08002 : CHANGE_LOG_SEQ.CURRVAL is not yet defined in this session. Хоть автор и тренируется, но сразу начинать тренироваться в плохом кодинге - плохой старт. В данном запросе для change_id,change_date не надо использовать bind - переменные, достаточно VALUES (CHANGE_LOG_SEQ.NEXTVAL,current_timestamp..., соответственно select ... from dual тоже не нужны. Желательно понять что такое bind переменные, зачем они используются и когда. Также, как уже писалось, не нужен execute immediate. cmnts := comments; тоже непонятно зачем, WHEN OTHERS THEN ROLLBACK; - сомнительно. Я бы советовал автору не пробовать "вкусные фичи", а просто написать вменяемый рабочий код.
Elic
Дата: 14.03.2011 08:02:28
Тарасенков Максим
Это моя первая программа на PL/SQL.
Вот когда напишешь сотую, тогда и лезь динамику. А пока не дорос.
Тарасенков Максим
Дата: 14.03.2011 11:58:14
Тогда вопрос по использованию переменных привязки.
Переменные привязки используются для того, чтобы избежать повторного разбора запроса, тем самым здорово экономя ресурсы системы.
Том Кайт пишет, что использовать их нужно по возможности всегда, за исключением некоторых случаев, когда использование переменных привязки может помешать оптимизатору выбрать оптимальный план выполнения.
Разве здесь такой случай?
wurdu
Дата: 14.03.2011 12:13:48
Тарасенков Максим
Тогда вопрос по использованию переменных привязки.
Переменные привязки используются для того, чтобы избежать повторного разбора запроса, тем самым здорово экономя ресурсы системы.
Том Кайт пишет, что использовать их нужно по возможности всегда, за исключением некоторых случаев, когда использование переменных привязки может помешать оптимизатору выбрать оптимальный план выполнения.
Разве здесь такой случай?
Повторный разбор запроса при неиспользовании bind-переменных связан с изменением текста запроса. В случае вызова current_timestamp и CHANGE_LOG_SEQ.NEXTVAL непосредственно в запросе, текст запроса не меняется, поэтому проблемы нет. Если же значение current_timestamp предварительно заносить в переменную, то, конечно, надо использовать bind-переменные.