2016-08-05 4 views
0

아래의 WHERE 절에 변수를 전달할 수있는 저장 프로 시저를 만들려고합니다.Teradata에서 저장 프로 시저를 사용하여 테이블 만들기

DROP TABLE fan0ia_mstr.Store_List; 

CREATE TABLE fan0ia_mstr.Store_List AS(

SELECT 
a11.ANA_Code, 
a11.Premise_Name_Full, 
a11.Store_Code, 
a11.Estates_Segment, 
a12.Post_Code 
FROM Store_Dimension_Hierarchy a11 
JOIN Location a12 
ON a11.ANA_Code = a12.ANA_Code 
WHERE a11.Area_Desc = 'VARIABLE') WITH DATA 
PRIMARY INDEX (ANA_Code) 

VARIABLE은 문자열입니다. 결과를 표시 할 필요가 없으며 테이블을 만들면됩니다.

또한 오류를 어떻게 트래핑합니까? 테이블이 어떤 이유로 존재하지 않는 경우 나는 아직도 그것이

감사

답변

1

를 삽입 cedure :

replace procedure myproc(IN variable varchar(100)) 
begin 

    BEGIN 
     -- simply try dropping the table and ignore the "table doesn't exist error" 
     DECLARE exit HANDLER FOR SQLEXCEPTION 
     BEGIN -- 3807 = table doesn't exist 
     IF SQLCODE <> 3807 THEN RESIGNAL; END IF; 
     END; 

     DROP TABLE fan0ia_mstr.Store_List; 
    END; 


    CREATE TABLE fan0ia_mstr.Store_List AS(

    SELECT 
    a11.ANA_Code, 
    a11.Premise_Name_Full, 
    a11.Store_Code, 
    a11.Estates_Segment, 
    a12.Post_Code 
    FROM Store_Dimension_Hierarchy a11 
    JOIN Location a12 
    ON a11.ANA_Code = a12.ANA_Code 
    WHERE a11.Area_Desc = :variable) WITH DATA 
    PRIMARY INDEX (ANA_Code); 

end; 

물론 DELETE/INSERT 또는 임시 테이블이 더 효율적일 수 있습니다.

+0

감사! 임시 테이블을 만들고 싶다면 CREATE와 TABLE 사이에 'volatile'이라는 단어를 추가하면됩니까? – MidnightDataGeek

+0

@MidnightDataGeek : ... PI 다음에'ON COMMIT PRESERVE ROWS'를 추가하십시오. – dnoeth

+0

빠른 답변을 주신 덕분에 많은 감사를드립니다. – MidnightDataGeek

0

편집 ... 두 번째 옵션은 즉시 너무 실행할 필요가 ...

CREATE PROCEDURE PROCEDURE1(
    V_AREA_DESC IN VARCHAR2) 
AS 
BEGIN 
    BEGIN 
    EXECUTE IMMEDIATE 'DROP TABLE fan0ia_mstr.Store_List'; 
    EXCEPTION 
    WHEN OTHERS THEN 
    NULL; 
    END; 

    EXECUTE IMMEDIATE 'CREATE TABLE fan0ia_mstr.Store_List AS 
    (SELECT a11.ANA_Code, 
     a11.Premise_Name_Full, 
     a11.Store_Code, 
     a11.Estates_Segment, 
     a12.Post_Code 
     FROM Store_Dimension_Hierarchy a11 
     JOIN Location a12 
     ON a11.ANA_Code  = a12.ANA_Code 
     WHERE a11.Area_Desc = ''' || v_area_desc || ''' 
    ) WITH DATA PRIMARY INDEX (ANA_Code)'; 

END PROCEDURE1; 

하지만 당신이 수를 생성 할/잘라 내기로 생성/드롭하지 않도록 당신이 단순히 저장 프로로 기존 코드 (약간 수정)를 포장 할 필요가 변수 데이터베이스/테이블/열 이름을 가지고 있지 않기 때문에

CREATE PROCEDURE PROCEDURE1(
    V_AREA_DESC IN VARCHAR2) 
AS 
BEGIN 
    execute immediate 'truncate TABLE fan0ia_mstr.Store_List'; 

    insert into fan0ia_mstr.Store_List (SELECT a11.ANA_Code, 
     a11.Premise_Name_Full, 
     a11.Store_Code, 
     a11.Estates_Segment, 
     a12.Post_Code 
     FROM Store_Dimension_Hierarchy a11 
     JOIN Location a12 
     ON a11.ANA_Code  = a12.ANA_Code 
     WHERE a11.Area_Desc = v_area_desc 
    ); 

    commit; 

END PROCEDURE1; 
+0

답장을 보내 주셔서 감사합니다. 위의 중 하나를 실행하려고하면 다음 오류 메시지가 나타납니다. '3707 : 구문 오류. 'CREATE'키워드와 'OR'키워드 사이에 'METHOD'키워드가 있어야합니다. Answerset 창으로의 출력 ' – MidnightDataGeek

+0

이것은 Oracle 코드이지만 Teradata의 SP 구문은 Standard SQL을 기반으로합니다. – dnoeth

관련 문제