2012-12-15 2 views
2

동적으로 생성 된 SQL을 Teradata에 제출할 방법이 있습니까? 테이블을 비정규 화하는 코드를 작성하는 쿼리를 작성했습니다. 지금 당장은 코드를 내 클라이언트 (SAS)로 가져 와서 두 번째 단계에서 다시 제출합니다. Teradata 매크로 또는 절차에 익숙하지 않습니다. 그 일이 좋을까요?Teradata에서 동적 SQL을 실행하는 방법

create multiset table MYTABLE 
    ( RECID integer generated always as identity 
       (start with 1 
       increment by 1 
       minvalue -2147483647 
       maxvalue 2147483647 
       no cycle) 
    , SNAP_DATE date format 'YYYY/MM/DD' 
    , EMAIL_DATE date format 'YYYY/MM/DD' 
    , FREQ integer 
    ) 
unique primary index (RECID ) 

이 테이블은 매일 (SNAP_DATE)를 채워지며 다른 테이블에 email_date에 대한 변경 사항을 모니터링하는 데 사용됩니다 :

내가 다음과 같이 정의 된 테이블을 가지고 설명합니다.

select RUN_THIS 
from (
    select RUN_THIS, RN 
    from (
     select 'select EMAIL_DATE ' (varchar(100)) as RUN_THIS 
       , 0 (int) as RN 
     ) x 

    union all 
    select ', sum(case when SNAP_DATE = date ''' 
      || (SNAP_DATE (format 'yyyy-mm-dd') (char(10))) 
      || ''' then FREQ else 0 end) as D' 
      || (SNAP_DATE (format 'yyyymmdd') (char(8))) as RUN_THIS 
      , row_number() over (partition by 1 order by SNAP_DATE) as RN 
    from (select distinct SNAP_DATE 
      from MYTABLE 
      where SNAP_DATE > current_date - 30) t1 

    union all 
    select RUN_THIS, RN 
    from (
     select 'from MYTABLE group by 1 order by 1;' as RUN_THIS 
       , 10000 as RN 
     ) y 
    ) t 
order by RN 

내가 돌아 다음, 제 의뢰인의 파일에 위의 쿼리의 결과를 내보내고 테라 데이타 다시 해당 파일을 제출 : 다음 쿼리는 내 비정규 뷰를 생성하기 위해 실행할 수있는 코드를 반환합니다. 일부 Teradata 객체에이 전체 정의를 저장하여 직접 실행할 수있는 방법이 있기를 희망합니다.

답변

2

DBC.SysExecSQL 명령을 사용하여 저장 프로 시저에 넣으면 성공할 수 있습니다.

다음은 Teradata의 저장 프로 시저에 대한 지나치게 단순화 된 예제입니다. 분명히 프로덕션에서는 유효하지 않은 데이터베이스 오브젝트와 같은 것을 처리하기 위해 정의 된 오류 핸들러가 필요합니다. 또한 SQLSTATE을 매개 변수로 반환하여 저장 프로 시저가 성공적으로 완료되었는지 여부를 테스트 할 수 있습니다.

CREATE PROCEDURE SYSDBA.CommentDatabase 
(
    IN P_Database VARCHAR(30), 
    IN P_Comment VARCHAR(255), 
    OUT MSG 
) 
MAIN: --Label 
BEGIN 

    DECLARE P_SQL_TEXT  VARCHAR(4000); 

    SET P_SQL_TEXT='COMMENT ON DATABASE '||P_DBNAME||' AS '''||P_COMMENT||''''; 
    CALL dbc.SysExecSQL (:P_SQL_TEXT); 

    SET MSG = 'Database '||P_DBNAME||' commented successfully!'; 
END; 
+0

이전에 저장 프로 시저를 사용한 적이 없습니다. 하나를 만들고 사용하는 간단한 예제를 공유 할 수 있습니까? 설명서를 사용할 수는 있지만 어디에서 볼 것인지 잘 모르겠습니다. – BellevueBob

+0

내가 시작할 수있는 예제를 추가했습니다. 추가 질문이 있으면 알려주십시오. –

관련 문제