2012-11-02 5 views
0

내가 같은 '% THIS %'

의 특정 값에 대한 데이터베이스의 모든보기를 검색하려고 검색하기 전에 뷰의 열이 있는지 확인 나는이 PLSQL 함께했다 코드

DECLARE 
    match_count INTEGER; 
BEGIN 
    FOR t IN (SELECT name FROM user_dependencies where type = 'VIEW') LOOP 

    EXECUTE IMMEDIATE 
    'SELECT COUNT(*) FROM '|| t.name || ' Where Column_Name LIKE ''%THIS%'' ' 
    INTO match_count; 

    IF match_count > 0 THEN 
     dbms_output.put_line(t.name ||' '||match_count); 
    END IF; 

    END LOOP; 
END; 

하지만 실행하려고하면 실행 immeadiate 쿼리에서 열 이름에 대해 잘못된 식별자 오류가 발생합니다.

모든보기에 Column_Name이있는 것은 아니지만 모든보기를 반복하면서 쿼리를 실행하기 전에 열이 있는지 확인하는 방법을 알 수 없습니다.

또한 약간 수정 된 버전을 사용하여 모든 테이블을 실행할 수 있었지만 모든 열이있는 것은 아니지만이 문제에 대해서는 실행되지 않았습니다.

편집 : 테이블을 순환하는 데 사용할 수있는 plsql 코드가 포함되어 있습니다.

DECLARE 
    match_count INTEGER; 
BEGIN 
    FOR t IN (SELECT table_name, column_name FROM all_tab_columns 
      where table_name LIKE 'THIS%' and data_type = 'VARCHAR2' AND column_name = 'Column_name') LOOP 

    EXECUTE IMMEDIATE 
    'SELECT COUNT(*) FROM '||t.table_name || ' Where Column_name LIKE ''%THIS%'' ' 
    INTO match_count; 

    IF match_count > 0 THEN 
     dbms_output.put_line(t.table_name ||' '||t.column_name||' '||match_count); 
    END IF; 

    END LOOP; 
END; 

답변

3

pl/sql 태그를 추가 한 이후로 오라클이라고 가정합니다. Oracle의 메타 데이터 테이블을 사용하여 테이블/뷰의 열을 확인할 수 있습니다. 특히 USER_TAB_COLUMNS. 이것은 '%의 스타트 %'와 같은 COLUMN_NAME이있는 모든 뷰를 질의한다

select count(*) 
from user_tab_columns 
where table_name = [name of view] 
and column_name = [name of column] 
+0

. 내 문제는 특정 열이 모두 반복되는지 확인하는 방법을 모르겠다는 것입니다. 이 작업을 개별적으로 수행하기에는 너무 많은 뷰가 있으며 if (column_name.exists) {} 기능이 없다는 것을 알고있는 한 멀리 있습니다. 편집시 테이블을 반복 할 때 사용했던 코드가 포함되었습니다. – user1399217

+2

@ user1399217 문제가 어디에 있는지 알 수 없습니다. 'all_tab_columns'는 테이블과 뷰를 반환합니다. – climbage

0

죄송합니다, 나는 나는 그들이 가지고있는 컬럼에 개별 뷰/테이블을 조회하는 방법을 알고 있음을 언급해야

declare 
cursor getViews is 
select table_name, column_name from user_tab_cols where table_name in 
(select view_name from user_views) 
and column_name like '%START%'; 
myResult number; 
BEGIN 
    for i in getViews 
    LOOP 
     execute immediate 'select count(*) from '||i.table_name into myResult; 
    END LOOP; 
END;