Поиск определенного значения в базе данных Oracle - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь найти определенное значение в базе данных Oracle, и скрипт не работает. Можно ли это сделать с помощью следующего кода?

DECLARE
  match_count integer;
  v_search_string varchar2(4000) := 'QS/Operation';

BEGIN  
  FOR t IN (SELECT owner,
                   table_name, 
                   column_name 
              FROM all_tab_columns
             WHERE data_type in ('VARCHAR2') ) 
  LOOP   
    BEGIN
      EXECUTE IMMEDIATE    
        'SELECT COUNT(*) FROM '||t.owner || '.' || t.table_name||
        ' WHERE '||t.column_name||' = :1'   
         INTO match_count  
        USING v_search_string; 
      IF match_count > 0 THEN 
        dbms_output.put_line( t.owner || '.' || t.table_name ||' '||t.column_name||' '||match_count );
      END IF; 
    EXCEPTION
      WHEN others THEN
        dbms_output.put_line( 'Error encountered trying to read ' ||
                              t.column_name || ' from ' || 
                              t.owner || '.' || t.table_name );
    END;
  END LOOP;
END;

Сценарий генерирует ошибки. Мне нужно знать, как обойти ошибки и найти значение в таблицах.

1 Ответ

0 голосов
/ 02 апреля 2020

Во-первых, ловить when others без повторного рейза обычно ошибка; здесь похоже, что вы намереваетесь сообщать об ошибках, но продолжаете, что не представляется необоснованным. Но вы должны включить ошибку в отображаемую вами информацию, например:

EXCEPTION
  WHEN others THEN
    dbms_output.put_line( 'Error encountered trying to read ' ||
                          t.column_name || ' from ' || 
                          t.owner || '.' || t.table_name );
    dbms_output.put_line(SQLERRM);
END;

Предположительно, это говорит о том, что таблицы не существуют, или у вас неверные идентификаторы, или у вас есть ошибки привилегий. Вы просматриваете все таблицы, принадлежащие всем, и даже не исключаете таблицы, принадлежащие SYS, как , как сделал исходный код - надеюсь, это не потому, что вы создаете свои собственные таблицы под SYS - и это возможно где-то там у вас есть таблицы с указанными в кавычках идентификаторами . На самом деле, это очень вероятно; SYS имеет _default_auditing_options_, а сгенерированные системой имена вложенных таблиц могут быть, например, в смешанном регистре.

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

BEGIN
  EXECUTE IMMEDIATE    
    'SELECT COUNT(*) FROM "' || t.owner || '"."' || t.table_name || '"' ||
    ' WHERE "' || t.column_name || '" = :1'   
     INTO match_count  
    USING v_search_string; 
...