2013-11-20 1 views
1

FOR 문에서 동적 SQL을 사용할 수 있습니까?FOR 루프 문에서 동적 SQL을 사용하는 방법은 무엇입니까?

FOR 루프를 사용하여 SELECT 문의 레코드 묶음을 처리하고 있습니다. 그러나 테이블 이름이 변수에 저장 될 수있는 것처럼 SELECT 문이 런타임에 프레임 화되게하려면 어떻게해야합니까?

for thisRecord as 
    select myColumn from MyTable --can this be dynamic? 
do 
    ....... 
end for; 

나는 당신은 단순히 루프에서 FETCH를 사용할 수있는 다음

declare myCursor cursor for stmt; 

set dynamicStmt = 'select myColumn from '||varTable; 
prepare stmt from dynamicStmt; 

for thisRecord as myCursor 
do 
    ...... 
end for; 
+0

동적 SQL에서 전체 cusor/FOR 문을 래핑 할 수 있습니까? 조언을하지는 않겠지 만 가능성은 있다고 생각합니다. –

+0

저장 프로 시저의 일부로, 확실하게 (어쨌든'FOR' 문을 어떻게 사용할 계획입니까?). 그래도 성취하고자하는 것은 무엇입니까? 나는 누군가가 동적 문장에 대한 테이블 이름을 저장할 때마다 약간의 걱정을 느낀다 ... –

+0

@ AllanS.Hansen FOR는 SQL 문 대신에 IF..ElSE와 같은 논리적 제어 명령문의 몇 가지 종류이므로 나는 할 수 없다고 생각한다. 가능하다해도 코드가 엉망이 될 것입니다. 나는 그것이 당신이 조언을하지 않는 이유라고 생각합니다. –

답변

1

같은 것을 원한다.

+0

네, 가져올 수 있음을 알고 있습니다. FOR 루프가 가능할 수 있는지 알고 싶습니다. 어쨌든 지적 해 주셔서 감사합니다. –

+0

@falsetru 해결책으로 사용할 수 있음을 명확히하기 위해 편집했습니다. 승인? – WarrenT

0

다른 누구도 내 질문에 답하지 않았으므로 FOR 문에서 동적 SQL을 직접 사용할 수 없다는 것을 의미합니다.

그러나 다른 사람들에 의해 말했듯이 FETCH를 사용할 수 있습니다. 나중에 알게 된 또 다른 까다로운 방법입니다. 제 경우에는 작동합니다.

동적 SQL을 사용하여 주어진 테이블에 대한 별칭을 만들고 FOR 문에이 별칭을 사용하십시오. 주의해야 할 것은 프로 시저를 컴파일 할 수 있도록 별칭이 있는지 확인하는 것입니다.

Create or replace procedure MyProcedure(tableName varchar(50)) 
Begin 
    EXECUTE IMMEDIATE 'Drop alias myAlias'; 
    EXECUTE IMMEDIATE 'Create alias myAlias for '||tableName; 

    for thisRecord as 
    select * from myAlias 
    do 
    ......... 
    end for; 
End 
관련 문제