Мне нужно внести изменения в хранимую процедуру Oracle, которая имеет следующие строки.

      InsStmt = 'INSERT INTO EMPLOYEE (Emp_cd, Emp_lst_nm, Emp_fst,nm) VALUES
                (:Emp_cd, :Emp_lst_nm, :Emp_fst_nm);';
    varExec :='
    DECLARE
      var1 VARCHAR2(100);
    BEGIN
      var1 := :Emp_cd||:Emp_lst_nm||:Emp_fst_nm;
      '||InsStmt||'
    END;';
   EXECUTE IMMEDIATE varExec USING ip_param_cd, ip_param_lnm, ip_param_fnm;

У меня есть только базовое представление о хранимых процедурах Oracle. После некоторого исследования я обнаружил, что || Оператор предназначен для объединения строк.

Но мне все еще интересно, что означает приведенное ниже утверждение

var1 := :Emp_cd||:Emp_lst_nm||:Emp_fst_nm;
      '||InsStmt||'

Я прошел через руководство по адресу http://docs.oracle .com / cd / B28359_01 / appdev.111 / b28843 / tdddg_procedures.htm # CIHGDECD, но помощи не удалось найти.

0
Srijit 17 Мар 2013 в 07:13
1
Это отрывок из общей картины, нам нужен весь код.
 – 
Sebas
17 Мар 2013 в 07:20
Обновлен полным кодом
 – 
Srijit
17 Мар 2013 в 07:49
Это бессмысленный фрагмент кода. Нет смысла просить нас угадывать намерения автора. Все, что вы можете сделать, это попросить их или того, кто вам поручил это изменить. Назначение VAR1 бессмысленно, поскольку оно (по-видимому) нигде не используется. Возможно, он предназначен для аудита или отладки?
 – 
APC
17 Мар 2013 в 13:44

1 ответ

Лучший ответ

Вне контекста триггера столбец : используется для связывания переменных внутри оператора.

Например:

EXECUTE IMMEDIATE 'UPDATE mytable SET age = 25 WHERE age = :1' 
     USING IN localVarAge;

В этом случае значение :1 будет заменено значением localVarAge. Порядок появления переменных ':' в подготовленном операторе имеет значение, а не их фактические метки.

В вашем коде явно отсутствует часть, эта часть var1 := :Emp_cd||:Emp_lst_nm||:Emp_fst_nm; должна быть заключена в кавычки. В любом случае это имело бы смысл, поскольку сразу после этого у вас есть заключительная цитата и конкатенация.

2
APC 17 Мар 2013 в 13:41
Спасибо, что очень помогло. Фактически они создают динамический оператор процедуры и выполняют его. Все еще не понимаю, в чем польза от var1;
 – 
Srijit
17 Мар 2013 в 07:48
О, я думаю, они им не пользуются! Вероятно, это остаток прошлого кода ... Например, для dbms_outputting перед вставкой
 – 
Sebas
17 Мар 2013 в 15:45
Я думаю, что мы можем настроить эту процедуру, вам следует открыть еще один вопрос со всем кодом для оптимизации производительности, я думаю, что сейчас это не оптимально
 – 
Sebas
17 Мар 2013 в 15:46