Столбец не допускается здесь ошибка в оракуле SQL вставки

Привет я получаю эту ошибку при попытке вставить параметр INPUT в таблицу ошибок

CREATE OR REPLACE PROCEDURE consolidate_SI(  
primary_SI   IN NUMBER,  
secondary_SI IN NUMBER )  
IS  
v_primary_si number;  
v_secondary_si number;   
Begin  
 v_primary_si:= primary_si;  
EXECUTE IMMEDIATE 'insert into error_log ( identifier, error_message) values 
(''Successfully updated'',v_primary_si)';  
execute immediate 'commit';  
End;   

Я получаю приведенную ниже ошибку во время выполнения

ORA-00984: колонка здесь не разрешена

2 ответа

Решение

Вам не нужен динамический SQL:

CREATE OR REPLACE PROCEDURE consolidate_SI(primary_SI IN NUMBER, secondary_SI IN NUMBER) IS
    v_primary_si                            NUMBER;
    v_secondary_si                          NUMBER;
BEGIN
    v_primary_si    := primary_si;

    insert into error_log ( identifier, error_message) values ('Successfully updated',v_primary_si);

    commit;
END;

Кроме того, проблема в том, как вы ссылаетесь на переменную v_primary_si в вашем динамическом SQL.

Динамический контекст SQL не знает, что v_primary_si is - переменные PL / SQL не находятся в области действия внутри этого контекста SQL - поэтому он видит его как идентификатор столбца по умолчанию: отсюда и ошибка. Чтобы использовать переменную PL / SQL, вы должны использовать ее как переменную связывания:

EXECUTE IMMEDIATE 'insert into error_log ( identifier, error_message) values 
  (''Successfully updated'',:v_primary_si)'
USING v_primary_si;  

Но ни то, ни коммит не должны быть здесь динамическими, вы можете просто сделать:

Begin
  v_primary_si:= primary_si; -- presumably you need this as a new variable later?
  insert into error_log ( identifier, error_message)
  values ('Successfully updated', v_primary_si);
  commit;
End;
Другие вопросы по тегам