Получение 'ORA00904: неверный идентификатор' для динамических таблиц - PullRequest
0 голосов
/ 30 августа 2018

У меня есть скрипт, который работает с динамическими таблицами. При выполнении приведенного ниже сегмента кода выдается ошибка ORA00904: invalid identifier.

IF Database_SYS.Column_Exist (service_tab_, ''KEY_VALUE'') THEN                           
   UPDATE '|| service_tab_ || '
   SET key_ref    = new_key_ref_,                                  
   key_value  = ''Test'',                                  
   rowversion = SYSDATE
   WHERE ROWID    = rec_.ROWID;                                                      
ELSE                                              
   UPDATE '|| service_tab_ || '
   SET key_ref    = new_key_ref_,                               
   rowversion = SYSDATE
   WHERE ROWID    = rec_.ROWID;                           
END IF;

Ответы [ 4 ]

0 голосов
/ 09 сентября 2018

Если единственное отличие заключается в обновлении столбца, правильнее было бы применить условие только к части запроса

DECLARE
    V_QUERY VARCHAR2(200);
BEGIN
    --
    V_QUERY := 'UPDATE '||service_tab_||
               '   SET key_ref    = new_key_ref_,              
                     rowversion = SYSDATE';
  --
    IF Database_SYS.Column_Exist (service_tab_, 'KEY_VALUE') THEN   
    V_QUERY := V_QUERY||', key_value  = ''Test''';
  END IF;
  --
  V_QUERY := V_QUERY||' WHERE ROWID    = rec_.ROWID';
  --
  EXECUTE IMMEDIATE V_QUERY;
  --
END;
0 голосов
/ 30 августа 2018
BEGIN
    IF Database_SYS.Column_Exist (service_tab_, '''' || KEY_VALUE || '''') -- 4x': StartString + Quote + ' + EndString  doublepipe to concat Strings
    THEN
        EXECUTE IMMEDIATE -- If you want to Build dynamic SQL you have to throw it into "EXECUTE IMMEDIATE 'myQuery'"
            'UPDATE ' || service_tab_ || '
                SET key_ref    = new_key_ref_,
                    key_value  = ''TEST'',
                    rowversion = SYSDATE
              WHERE ROWID    = rec_.ROWID';
    ELSE
        EXECUTE IMMEDIATE
            'UPDATE ' || service_tab_ || '
                SET key_ref    = new_key_ref_,
                    rowversion = SYSDATE
              WHERE ROWID    = rec_.ROWID';
    END IF;
END;

В следующий раз вы должны пошагово построить свой скрипт. Одна ошибка может быть обработана лучше, чем набор неверных кодов.

0 голосов
/ 30 августа 2018

Лучше бы этот:

BEGIN
    IF Database_SYS.Column_Exist (service_tab_, '''' || KEY_VALUE || '''') THEN
        EXECUTE IMMEDIATE 
            'UPDATE ' || service_tab_ || '
                SET key_ref    = new_key_ref_,
                    key_value  = :val,
                    rowversion = SYSDATE
              WHERE ROWID    = :rid'
        USING 'TEST', rec_.ROWID;
    ELSE
        EXECUTE IMMEDIATE
            'UPDATE ' || service_tab_ || '
                SET key_ref    = new_key_ref_,
                    rowversion = SYSDATE
              WHERE ROWID    = :rid'
        USING rec_.ROWID;
    END IF;
END;

Не думаю, что вам нужно '''' || KEY_VALUE || '''', просто используйте Database_SYS.Column_Exist(service_tab_, KEY_VALUE), если вы правильно закодировали функцию.

0 голосов
/ 30 августа 2018

Попробуйте что-то вроде этого:

EXECUTE IMMEDIATE 'update' ||  service_tab_ || 'SET key_ref    = ' ||new_key_ref_|| ' rowversion = SYSDATE   WHERE ROWID    = '|| rec_.ROWID;

Дайте мне знать, если вы получите дальнейшие ошибки, мы можем разрешить их вместе в комментариях.

...