2014-06-16 2 views
1

필자에게는 field_name_1, field_name_2, ..., field_name_200 열이있는 Oracle 데이터베이스 테이블이 있습니다. 데이터의 각 행에 대해 루프의 각 열을 선택하고 업데이트하고 친절하게 지원하고 싶습니다.루프에서 유사한 패턴의 열 이름 선택

DECLARE 

    l_udf_vals tablea%ROWTYPE; 

    field_val_temp varchar2(150); 

    field_val field_val_temp%TYPE; 

    BEGIN 
    FOR yu IN (SELECT a.* FROM tablea a, tableb b, tablec c 
       WHERE a.function_id=b.function_id AND b.col = c.col AND ) 
     LOOP 
     FOR i IN 1..200 
     LOOP 

     field_val_temp := 'field_val_'||i; 

     SELECT field_val_temp INTO field_val FROM tableb 
     WHERE function_id='STDCUSAC' AND rec_key = yu.rec_key; 

     IF field_val IS NOT NULL THEN 
     UPDATE tablec SET 'field_val_'||i = field_val; 

     END LOOP; 
     COMMIT; 
     END LOOP; 
     COMMIT; 
    END; 
+0

여기에 질문을 게시 할 때주의하지 마십시오. 읽는 것을 더 어렵게 만듭니다. 답을 빨리 얻을 수 없으며, 다소 성가신 일입니다. 키보드 양쪽에 Shift 키가있어 사용하기 쉽습니다. 이렇게하십시오. 감사. –

+0

Noted Ken. 감사. – Gideon

답변

0
EXECUTE IMMEDIATE 'SELECT '||field_val_temp ||' FROM tableb 
    WHERE function_id = :func_val AND rec_key = :rec_key' INTO field_val 
    USING 'STDCUSAC' , yu.rec_key; 

그리고,

EXECUTE IMMEDIATE 'UPDATE tablec SET field_val_'||i||' = :field_val' 
    USING field_val; 

당신은 Dynamic SQL을 사용해야합니다. 그러나 @duffymo가 말했듯이, 테이블을 정상화하기 위해 다시 생각해보십시오. 또한 동일한 테이블을 업데이트하는 경우 루프 후 여러 열에 대해 단일 쿼리 문자열로 프레임화하십시오.

+0

오라클 사용자에게 감사드립니다. 내가 성취하고자하는 것은 tableb의 해당 컬럼 데이터가 null이 아닌 다른 테이블 (tableb, tablea와 동일한 구조를 가짐)의 데이터로 tablea (200 개의 field_val_ * 컬럼을 가짐)를 갱신하는 것입니다. 게시 한 코드가 내 의도를 잘 나타내지 않았을 수 있습니다. 도와주세요. PL/SQL에서 시작합니다. 다시 감사합니다. – Gideon

+0

다시 한번 고마워요. Execute Immediate 문이 정상적으로 작동했습니다! – Gideon

0

이렇게 많은 수준에서 끔찍한 생각입니다.

우선, 정규화되지 않았습니다.

둘째로, 당신은 잠재적 인 죽음을 맞이할 것입니다. 성능은 끔찍할 것입니다.

이것은 키 입력을 저장하는 방법이 아닙니다. 나는 스키마와 코드를 리팩터링했다.

관련 문제