2017-02-14 1 views
1

다른 환경에있는 테이블의 데이터를 테이블에 삽입해야합니다. env 목록은 my_env 테이블에서 가져옵니다. 내 경우를 들어 envs의 수는 그래서 ENV 이름을 동적 그러므로 내가 아래로 쓴 것이 다를 수 있습니다PLSQL : to_able 이름을 동적으로 유지하면서 다른 환경으로 한 테이블의 데이터를 삽입 할 수 있습니다.

DECLARE 
WRK_STS VARCHAR2(2) := 'PP'; 
MY_ENV VARCHAR2(50) := ''; 
WRK_ENV NUMBER(6)  := 0; 
BEGIN 
    FOR t in (SELECT DISTINCT(envid) FROM MY_ENV ORDER BY  ENVID ASC) 
    LOOP 
    WRK_ENV := WRK_ENV+1; 
    MY_ENV := 'ENV_' || t.envid || '.table002'; 
    INSERT INTO MYTAB101(DATE,STS, MYENV, nAME, DESCR, MYTYPE) 
    SELECT null, ' || WRK_STS|| ',' || WRK_ENV || ',NAME, DESCR,MYTYPE from ' || MY_ENV; 
    END LOOP; 
EXCEPTION 
/*Handle exception*/ 
END; 
/
COMMIT; 

그러나 나는 점점 오전 오류 :

ORA-06550 : 줄 15, 열 61 : PL/SQL : ORA-00942 : 테이블 또는 뷰가 존재하지 않습니다. ORA-06550 : 12 행 3 열 : PL/SQL : SQL 문이 무시되었습니다. 06550. 00000 - "행 % s, 열 % s : \ n % s"* 원인 : 보통 PL/SQL 컴파일 오류. * 액션 : 커밋.

내가 직접 같이 작동 ENV 이름을 입력하면 '에서를 ENV368.table002'

누군가가 여기에 무엇이 잘못되었는지를 제안 할 수 있습니다?

감사합니다 !!! 그것이 있어야 난 당신의 사건에 대한 생각

MY_ENV := 'ENV_' || t.envid || '.table002'; 

:

+1

. EXECUTE IMMEDIATE – OldProgrammer

+0

즉각적인 시도 : EXTERNAL IN MYTAB101 (날짜, STS, MYENV, 이름, DESCR, MYTYPE) SELECT NULL, '|| WRK_STS || ','|| WRK_ENV || ', NAME, DESCR, MYTYPE에서'|| MY_ENV; 하지만이 또한 오류가 있습니다 – Mishti

+0

그럼 오류가 무엇입니까 ?? – OldProgrammer

답변

0

테스트되지 않은,하지만 난 일반적인 형식이 같은 것으로 기대 : 당신은 할 수 없습니다

declare 
    l_wrk_stats varchar2(2) := 'PP'; 
    l_my_env varchar2(50); 
    l_wrk_env number(6) := 0; 
    l_sql  varchar2(500); 
begin 
    for r in (
     select distinct envid 
     from my_env 
     order by envid 
    ) 
    loop 
     l_wrk_env := l_wrk_env + 1; 
     l_my_env := 'ENV_' || r.envid || '.table002'; 
     l_sql := 
      'insert into mytab101 (date, sts, myenv, name, descr, mytype)' || chr(10) || 
      'select null, :b1, :b2, name, descr, mytype from ' || l_my_env; 

     execute immediate l_sql using l_wrk_stats, l_wrk_env; 
    end loop; 

exception 
    when others then 
     raise_application_error(-20000, 'Command failed: ' || l_sql, true); 
end; 
+0

Thannks !! 그것은 효과가 있었다. – Mishti

+0

2 테이블 조인을 위해이 쿼리를 사용할 수 있습니까? 나는 table002와 table001을 가지고있다. 그러면 다음과 같이 수정 될 것이다. 'mytab101 (날짜, sts, myenv, 이름, descr, mytype)에 삽입' '| chr (10) || 'select null, : b1, : b2, a.name, a.descr, b.mytype from'|| l_my_env a, l_my_env2 b || 'where a.name = b.name'; 위 작품 중 하나가 올 것인가? – Mishti

0

'ENV_'캐릭터도 강조하고 있기 때문에는 아래와

MY_ENV := 'ENV' || t.envid || '.table002'; 
0

여기에 주요 아이디어는 사용하는 것입니다 동적 SQL 및 EXECUTE 귀하의 요구 사항을 만족시키기 위해 즉각적입니다. 귀하의 블록을 조금 수정했습니다. 나는 나와 함께 작업 공간을 가지고 있지 않기 때문에 그것을 테스트하지 않았다. 희망이 도움이됩니다.

DECLARE 
    WRK_STS VARCHAR2(2) := 'PP'; 
    MY_ENV VARCHAR2(50) := ''; 
    WRK_ENV NUMBER(6) := 0; 
TYPE ENV 
IS 
    TABLE OF VARCHAR2(100); 
    env_tab env; 
BEGIN 
    EXECUTE IMMEDIATE 'SELECT DISTINCT(envid) FROM '||MY_ENV||' ORDER BY ENVID' BULK COLLECT INTO env_tab; 
    FOR i IN env_tab.FIRST..env_tab.LAST 
    LOOP 
    WRK_ENV := WRK_ENV+1; 
    MY_ENV := 'ENV_' || ENV_TAB(I) || '.table002'; 
    EXECUTE IMMEDIATE ' INSERT INTO MYTAB101  
    (date,STS, MYENV, nAME, DESCR, MYTYPE  
    )  
     SELECT NULL,  
     WRK_STS,  
     wrk_env,  
     ''NAME'',  
     ''DESCR'',  
     ''MYTYPE''  
FROM ' || MY_ENV; 
    END LOOP; 
    COMMIT; 
EXCEPTION 
WHEN OTHERS THEN 
    NULL; --when others should not be used 
END; 
/