2016-06-23 3 views
0

이 질문은 중복 된 것으로 알고 있지만 토론을 다시 열 수있는 방법을 찾지 못했습니다. 모든 테이블의 모든 열에서 값을 검색하는 저장된 proc를 만들려고합니다. 이것은 내가 지금까지 만든 것입니다 :모든 열, 특정 값에 대한 모든 테이블 검색

CLEAR SCREEN 
SET VERIFY OFF 
ACCEPT val CHAR PROMPT 'What value do you want to search for: ' 
CLEAR SCREEN; 
DECLARE 
match_count integer; 
v_search_string varchar2(4000) := <<val>>; 
BEGIN 
FOR t IN (SELECT owner, 
table_name, 
column_name 
FROM all_tab_columns 
WHERE data_type in ('CHAR', 'VARCHAR2', 'NCHAR', 'NVARCHAR2', 
'CLOB', 'NCLOB')) 
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; 
/

그러나 오류가 발생합니다. 어떤 도움을 주시면 감사하겠습니다!

+4

잘됩니다!? –

+1

복제중인 질문을 찾을 수 있습니까? 그것도 도움이 될 것입니다 – cdomination

+0

[이 답변에서 가져온 것처럼 보입니다] (http://stackoverflow.com/a/6389779/266304). –

답변

1

는 의견 참조 : 오류가 무엇

CLEAR SCREEN 
SET VERIFY OFF 
ACCEPT val CHAR PROMPT 'What value do you want to search for: ' 
CLEAR SCREEN; 

DECLARE 
    match_count        INTEGER; 
    v_search_string       VARCHAR2(4000) := '&val'; /* this was <<val>> */ 
BEGIN 
    FOR t IN (SELECT owner, 
        table_name, 
        column_name 
       FROM all_tab_columns 
       WHERE data_type IN ('CHAR', 
            'VARCHAR2', 
            'NCHAR', 
            'NVARCHAR2', 
            'CLOB', 
            'NCLOB')) 
    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; 
/ 
+0

거기서 마지막 두 줄은 제대로 포맷되지 않았습니다. –

+0

좋습니다! 나는 오류가 없지만 어떤 결과를 내기 위해 LOOOOOOOOONG 시간이 걸립니다. 어쨌든이 속도를 높이거나 요청자를 통해 db 이름을 지정할 수 있습니까? – TrickyDBA

+0

@AlexPoole : 감사합니다. TrickyDBA의 경우 : DBA 또는 ALL 뷰를 사용하는 경우 스키마별로 필터를 추가 할 수 있습니다. 그러나 원하는 스키마의 모든 테이블을 전체적으로 검사하므로 좋은 성능을 기대할 수 없습니다. 환경에 따라 코드를 편집하여 병렬 힌트를 추가 할 수 있습니다. – Aleksej

관련 문제