Pessoal,

Gostaria de saber se é uma boa abordagem, criar pacotes utilizando 
variáveis para receber consultas e, dependendo de determinadas 
condições, executar uma ou outra através de concatenação.

Coloquei um exemplo abaixo somente para ilustrar o que eu quero 
dizer. Quais as implicações desse tipo de abordagem?



CREATE OR REPLACE PACKAGE pacote_01
AS
    DATA_1                 DATE;
    DATA_2                 DATE;
    FLAG_1           NUMBER;
    DATE_NULL                  DATE := NULL;
    FLAG_2                NUMBER := NULL;
    SEL_XX                     VARCHAR2 (5000);

    ABC_00                     VARCHAR2 (3000) :=
      'SELECT /*+ RULE */
              H.COLUNA1,
              H.COLUNA2,
              H.COLUNA3,
              H.COLUNA4,
              H.COLUNA5,
              COUNT(1),
              SUM(H.COLUNA6),
              SUM(H.COLUNA7),
              SUM(H.COLUNA8),
              SUM(DECODE(H.COLUNA6,
                    (NVL(H.COLUNA7 +
                         H.COLUNA8, 0) +
                     NVL(H.COLUNA9 , 0) +
                     NVL(H.COLUNA10 +
                         H.COLUNA11 +
                         H.COLUNA12, 0) ), 0, 1)' ;

    ABC_01                 VARCHAR2 (3000) :=
      '       H.COLUNA_A,
              H.COLUNA_B,
              H.COLUNA_C,
              H.COLUNA_D 
         FROM TABELA1 H
        WHERE H.COLUNA_50 = :BIND_1
          AND H.COLUNA_51 = :BIND_2
          AND F.COLUNA_52 = CONDICAO_1';


    ABC_02                 VARCHAR2 (3000) :=
      '       H.COLUNA_D,
              H.COLUNA_E,
              H.COLUNA_F,
              H.COLUNA_G
         FROM TABELA1 H
        WHERE H.COLUNA_50 > :BIND_1
          AND H.COLUNA_51 < :BIND_2
          AND H.COLUNA_52 = CONDICAO_1';



  PROCEDURE A_1 (
            BIND_1          NUMBER,
            BIND_2          DATE,
            CONDICAO_1      NUMBER );
END pacote_01;

CREATE OR REPLACE PACKAGE BODY pacote_01
AS

  PROCEDURE A_1 (
            BIND_1          NUMBER,
            BIND_2          DATE,
            CONDICAO_1      NUMBER )

  IS
    DATA                   DATE;
    FLAG_1                 VARCHAR2(4);
    FLAG_2                 VARCHAR2(50);
    OPCAO                  NUMBER ;

  BEGIN

    IF OPCAO = 1 THEN
       SEL_XX := ABC_00 || ABC_01;
    ELSIF P_OPCAO = 2  THEN
       SEL_XX := ABC_00 || ABC_02;
    END IF;

  END A_1;



END pacote_01;


Responder a