2016-12-16 9 views
-1

Синтаксис: PL SQL IDE: PL/SQL DeveloperАвтоматизировать Создать процедуру таблицы с помощью динамического 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; 

Используя значение курсора выше, как я могу идти о вставке этих значений в не только имя таблицы, используемом в Создании таблицы части заявления Sql, но в качестве параметра в ИНЕКЕ

-- 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; 
+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; 

Я не могу вспомнить, что ограничения, когда речь идет о конкатенации с EXECUTE IMMEDIATE, но если это не работает, то можно использовать переменные связывания и USING положение.

+0

Этот процесс работал очень хорошо и выполнялся с несколькими твиками. – BGDev

+0

Этот процесс работал очень хорошо и выполнялся с ОДНОМ tweek. 1. Предложение where должно быть WHERE REGION = '' '|| REC.REGION ||| '' 'Спасибо – BGDev

+0

@BGDev ах, это получает меня почти каждый раз. Рад, что вы разобрались! Спасибо, что указали это, я исправлю это в ответе. – tilper

 Смежные вопросы

  • Нет связанных вопросов^_^