2016-12-16 10 views
-1

구문 : PL SQL IDE를 : PL/SQL 개발자자동화가 커서 또는 루프를 사용하여 동적 SQL을 사용하여 테이블 절차 생성 - PLSQL

나는 지역, 일련의 코드를 사용하여 각 지역의 4 개 테이블을 생성하려고 해요입니다.

모든 지역이 포함 된 테이블을 생성하고이 테이블을 잘라내어 바꾸는 것이 더 효율적일 수 있다는 것을 이해합니다. 그러나이 테이블은 사용하기 위해 필요한 구조에 따라 허용되지 않습니다.

4 개 지역는 특정 테이블

SELECT DISTINCT REGION 
FROM REGION_TABLE 
; 

동적 테이블의이 시리즈를 생성하는 가장 좋은 방법은 무엇입니까에서 온?

커서와 루프를 사용하려고했지만이 커서를 다음 절차에 통합하는 방법이 확실하지 않습니다.

DECLARE 
CURSOR C_REGION IS 
     SELECT DISTINCT REGION FROM REGION_TABLE ; 
BEGIN 
    FOR L_IDX IN C_REGION 
    LOOP 
    DBMS_OUTPUT.PUTLINE(L_IDX.C_REGION); 
    END LOOP; 
END; 

위의 커서 값을 사용하여, 어떻게 where 절

-- 4 REGIONS - NORTH SOUTH EAST WEST, 

CREATE OR REPLACE PROCEDURE SALES_ORDER_TBL_PROC 
      (
      REGION IN VARCHAR2 
      , RETURNCODE OUT NUMBER 
      , ERROR_MESSAGE OUT VARCHAR2 
     ) 
      IS 
    TABLE_NAME VARCHAR2(30); 
    SQL_STR VARCHAR2; 
    REGION_VAR VARCHAR;   
BEGIN 
    TABLE_NAME := 'SALES_COUNT_'||REGION_VAR; 
    SQL_STR := 'CREATE TABLE '||TABLE_NAME|| 
      ' AS 
       (
       SELECT 
         REGION 
          , COUNT(DISTINCT MEMBER_ID) AS NUM_MBR 
         FROM INCREMENTAL_SALES_TBL 
         WHERE 1=1 
          AND REGION = '||REGION_VAR|| 
          'GROUP BY REGION)' 
       ; 

EXECUTE IMMEDIATE SQL_STR ; 

     RETURNCODE := 0; 

EXCEPTION WHEN OTHERS THEN 

     RETURNCODE := SQLCODE; 

     ERROR_MESSAGE :='ERR:Creating/Altering table '||TABLE_NAME ||'-'||SQLERRM; 
END; 
/

BEGIN 
    SALES_ORDER_TBL_PROC; 
END; 
에서 매개 변수 SQL 문 작성 테이블 부분에 사용뿐만 아니라 테이블 이름으로하지만, 이러한 값을 삽입 가야 할
+1

테이블을 만드는 것은 한 번만하는 것처럼 보입니다. 왜 그걸위한 절차가 필요한가요? – GurV

+0

이들은보고 표입니다. - 회사 절차는 비행 중에 재건되기 만하면됩니다. – BGDev

+1

잘 자르고 데이터를 – GurV

답변

1

DDL을 for 루프에 넣는 것은 어떻습니까? 아래 코드를 테스트하지는 않았지만 적어도 목표를 향한 경로를 따라야합니다.

FOR rec IN (SELECT DISTINCT REGION FROM REGION_TABLE) LOOP 
    EXECUTE IMMEDIATE 
    'CREATE TABLE SALES_COUNT_' || UPPER(rec.region) || ' AS (
     SELECT REGION, 
       COUNT(DISTINCT MEMBER_ID) AS NUM_MBR 
     FROM INCREMENTAL_SALES_TBL 
     WHERE REGION = ''' || rec.region || ''' 
     GROUP BY REGION)'; 
END LOOP; 

나는 IMMEDIATE EXECUTE와 연결에 관해서 제한이 무엇인지 기억할 수는 없지만, 그 다음 작동하지 않는 경우는 바인드 변수와 USING 절을 사용하는 것이 가능하다.

+0

이 프로세스는 매우 잘 작동하고 몇 트위크로 실행됩니다. – BGDev

+0

이 프로세스는 매우 잘 작동하고 하나의 tweek로 실행됩니다. 1. where 절은 WHERE REGION = '' '이어야합니다. REC.REGION ||| '' '감사합니다. – BGDev

+0

@BGDev 아, 그럴 때가 거의 언제나옵니다. 다행 이군요. 그것을 지적 주셔서 감사합니다, 나는 대답에 그것을 해결합니다. – tilper