2014-07-08 2 views
0

거의 도움이 필요하지 않습니다. 4 개의 열 이름과 2 개의 테이블 이름을 6 개의 커서 변수에 출력하는 동적 쿼리가 있습니다. 이제 커서 변수를 사용하여 처음 4 개 열을 선택한 다음 커서 변수를 사용하여 두 테이블 이름에서 데이터를 포함하므로 쿼리를 포함하는 변수를 사용하여 가져 오기를 통해 가져온 것으로 생각하지만 모름니다. 그것에 대해 어떻게 가야하는지. 여기 내가 지금 가지고있는 것만으로 커서 변수를 가져 와서 쿼리에 헴을 넣을 필요가 있습니다.oracle 동적 쿼리 SQL을 통해 커서 변수 가져 오기

DECLARE 
arow   VARCHAR2 (1000); 

column1   VARCHAR2 (50); 
column2   VARCHAR2 (50); 
column3   VARCHAR2 (50); 
column4   VARCHAR2 (50); 
table1   VARCHAR2 (50); 
table2   VARCHAR2 (50); 
match   VARCHAR2 (50); 
match1   VARCHAR2 (50); 
sql_statement VARCHAR2 (500); 
BEGIN 
FOR arow IN (SELECT column_name_old, 
        column_name_new, 
        column_name_old_2, 
        column_name_new_2, 
        table_name_old, 
        table_name_new 
       FROM A550003.META_DATA_TABLE) 
LOOP 
    sql_statement := 
     'INSERT' 
    || ' ' 
    || 'INTO' 
    || ' ' 
    || 'a550003.MATCH_TABLE' 
    || ' ' 
    || 'SELECT ' 
    || arow.column_name_old 
    || ', ' 
    || arow.column_name_new 
    || ', ' 
    || 'DECODE(' 
    || arow.column_name_old 
    || ', ' 
    || arow.column_name_new 
    || ',' 
    || '1' 
    || ',' 
    || '0)' 
    || 'AS' 
    || ' ' 
    || 'MATCH' 
    || ',' 
    || arow.column_name_old_2 
    || ', ' 
    || arow.column_name_new_2 
    || ',' 
    || 'DECODE(' 
    || arow.column_name_old_2 
    || ', ' 
    || arow.column_name_new_2 
    || ',' 
    || '1' 
    || ',' 
    || '0)' 
    || 'AS' 
    || ' ' 
    || 'MATCH1' 
    || ' FROM ' 
    ||' ' 
    || arow.table_name_old 
    || ', ' 
    || arow.table_name_new 
    || ' WHERE ' 
    || arow.column_name_old 
    || '=' 
    || arow.column_name_new 
    || '(+)'; 
    DBMS_OUTPUT.PUT_LINE (sql_statement); 

EXECUTE IMMEDIATE sql_statement; 

    COMMIT; 
END LOOP; 
END; 

답변

0

우선 sql_statement가 잘못되었습니다. EXECUTE IMMEDIATE 문

sql_statement := 'SELECT ' 
       || column1 
       || ', ' 
       || column2 
       || ', ' 
       || column3 
       || ', ' 
       || column4 
       || ' FROM ' 
       || table1 
       || ', ' 
       || table2 
       || ' WHERE ' 
       || -- JOIN_CONDITION 

을 그리고 당신은 사용할 수 있습니다 : 물론 변수의

EXECUTE IMMEDIATE sql_statement 
      INTO col1_val 
       ,col2_val 
       ,col3_val 
       ,col4_val 
       ; 

가 [내지 컬럼를 (당신이 필요한 모든 이름을 얻을 것이다 경우)이 같은 STH이 변수의 값을 설정해야합니다 1..4] _val을 선언해야합니다.

SQL 인젝션도주의하십시오.

+0

야. 내 원래의 게시물 쿼리를 편집하고 그것이 옳다면 나는 안 먹었어. immediatly를 실행하여 누락 된 표현을 얻었습니다. curosor 값을 읽은 후에 어디로 가야하는지 확실하지 않습니다. – Anthony

+0

1. 질문을 올리기 전에 코드를 포맷 해보십시오. 2. 커서를 사용하여 데이터를 가져온 후 쿼리를 작성합니다 (sql_statement 변수 설정). 3. select는 4 개의 열을 반환하므로 tab1_val과 tab2_val을'EXECUTE IMMEDIATE' 문의'INTO' 부분에 넣으면 안됩니다. 4. INTO를 사용하는 경우 select는 항상 하나의 레코드를 리턴해야합니다. 더 많은 결과가 기대된다면 BULK COLLECT INTO와 변수 인 collection을 사용해야합니다. – kpater87

+0

위 코드가 컴파일되지만 아무 것도 실제로는 데이터 이동 색인에 실제로 삽입되지 않습니다. – Anthony

0

그것은이 있어야합니다 :

sql_statement := 'SELECT ' 
    || column1 || ', ' || column2 || ', ' || column3 || ', ' || column4 
    || ' FROM ' || table1 || ', ' || table2 
    || ' WHERE ' || column1 ||'=' ||column2||'(+)'; 
EXECUTE IMMEDIATE sql_statement INTO col1_val, col2_val, col3_val, col4_val; 

바람직

sql_statement := 'SELECT ' 
    || column1 || ', ' || column2 || ', ' || column3 || ', ' || column4 
    ||' FROM '||table1||' LEFT OUTER JOIN '||table2||' ON '||column1||'='||column2; 
EXECUTE IMMEDIATE sql_statement INTO col1_val, col2_val, col3_val, col4_val; 

DBMS_OUTPUT.PUT_LINE (sql_statement);를 디버깅하는 것이 유용 할 것이다!

그런 다음 당신이 참조 - 커서가 필요하지 않습니다, 단순히 수행

내가 동적 SQL을 톤을 사용 havnt 죄송 당신의 응답을 kpater 감사
BEGIN 
    For aRow in (SELECT * FROM a550003.meta_data_table) LOOP 
     sql_statement := 'SELECT '||aRow.column1||','||aRow.column2 ... 
    END LOOP; 
END; 
+0

헤이 Wernfried 도움을 주셔서 감사합니다 그것이 정확히 내가 원하는 것 같습니다.내가 일하고있어 지금은 테이블에 sql_staement을 쓰고 싶다면 (arow 부분에 대한) 전에 instert 같은 일을 할 것이라고, 나는 또한 지금 그냥 sql_statement 실행할 필요가있는 것처럼 편집기 탭을 클릭하고 쿼리를 실행하십시오. 이제 내가 필요로하는 쿼리는 DBMS 출력에 있지만 지금은 실제로 실행할 수있는 것으로 처리해야합니다. – Anthony

관련 문제