2012-09-11 4 views
0

나는, 같은 이름을 가진 부부와 끝 번호 다음 표 이름 템플릿가있다all_tables 중에서 선택시 테이블을 선택하는 방법은 무엇입니까? 예를 들어 fmj.backup_semaforo_geo_THENUMBER, :

select * from fmj.backup_semaforo_geo_06391442 
select * from fmj.backup_semaforo_geo_06398164 
... 

내가 모든 테이블에서 열을 선택해야합니다 말할 수 있습니다 'fmj.backup_semaforo_geo_ %'필터를 성공하는,이 시도 :

SELECT calle --This column is from the backup_semaforo_geo_# tables 
    FROM (SELECT table_name 
     FROM all_tables 
    WHERE owner = 'FMJ' AND table_name LIKE 'BACKUP_SEMAFORO_GEO_%'); 

을하지만 난 ALL_TABLES 테이블 이름 데이터를 받고 있어요 :

TABLE_NAME 
---------- 
BACKUP_SEMAFORO_GEO_06391442 
BACKUP_SEMAFORO_GEO_06398164 
... 
,691,363을210

all_tables 출력을 얻지 않고 어떻게이를 수행 할 수 있습니까?

감사합니다.

+0

FMj 사용자에 속한 모든 테이블을 가지고 있습니다. 어떤 결과를 기대합니까? –

+0

는 지금은 지금은 맞아,하지만 난이 필요합니다 SELECT TABLE_NAME 을 ALL_TABLES FROM 소유자 = 'FMJ'AND TABLE_NAME LIKE 'BACKUP_SEMAFORO_GEO_ %의'출력 해당 쿼리와 일치하는 테이블의 일련의 내가 있음을 추가 할 수 있습니다 WHERE 이 BACKUP_SEMAFORO_GEO_06391442, BACKUP_SEMAFORO_GEO_06398164 FROM ... 내가 지금 읽고 내가 길을 잘못 생각 볼 SELECT 칼레 --This 열이 backup_semaforo_geo_ 번호 테이블에서있다 : 외부 쿼리에 그래서 결국 내가 좋아하는 뭔가를 얻을 ... – MauJFernandez

답변

2

아마도 현재의 쿼리는 ORA-00904: "CALLE": invalid identifier을 받고있다. 불행히도 런타임에 쿼리에 테이블 이름을 제공 할 수없고 dynamic SQL에 의존해야합니다.

이런 식으로 모든 테이블을 반복하고 각각에 대해 CALLE의 모든 값을 가져 와서 루프 할 수 있습니다. 나는 당신이 이것을 SQL * Plus 나 그 일을 처리 할 수 ​​있다고 가정 할 때 DBMS_OUTPUT을 사용하여 표시했습니다. 그러나 당신은 그 (것)들을 가진 다른 무언가를하고 싶을 수도있다.

set serveroutput on 

declare 
    -- declare a local collection type we can use for bulk collect; use any table 
    -- that has the column, or if there isn't a stable one use the actual data 
    -- type, varchar2(30) or whatever is appropriate 
    type t_values is table of table.calle%type; 
    -- declare an instance of that type 
    l_values t_values; 
    -- declare a cursor to generate the dynamic SQL; where this is done is a 
    -- matter of taste (can use 'open x for select ...', then fetch, etc.) 
    -- If you run the query on its own you'll see the individual selects from 
    -- all the tables 
    cursor c1 is 
     select table_name, 
      'select calle from ' || owner ||'.'|| table_name as query 
     from all_tables 
     where owner = 'FMJ' 
     and table_name like 'BACKUP_SEMAFORO_GEO%' 
     order by table_name; 
begin 
    -- loop around all the dynamic queries from the cursor 
    for r1 in c1 loop 
     -- for each one, execute it as dynamic SQL, with a bulk collect into 
     -- the collection type created above 
     execute immediate r1.query bulk collect into l_values; 
     -- loop around all the elements in the collection, and print each one 
     for i in 1..l_values.count loop 
      dbms_output.put_line(r1.table_name ||': ' || l_values(i)); 
     end loop; 
    end loop; 
end; 
/
+0

인상적입니다, 정말 고마워요! – MauJFernandez

0

PLSQL 프로그램의 동적 SQL이 될 수 있습니다. 서브 쿼리가 CALLE라는 열이 없기 때문에

for a in (SELECT table_name 
      FROM all_tables 
      WHERE owner = 'FMJ' AND table_name LIKE 'BACKUP_SEMAFORO_GEO_%') 
LOOP 
    sql_stmt := ' SELECT calle FROM' || a.table_name; 
    EXECUTE IMMEDIATE sql_stmt; 
    ... 
    ... 
END LOOP; 
관련 문제