PL / SQL anonymous block | ERROR PLS-00103: Encountered the symbol "CREATE" when expecting one of the following:

4

I get the following error:

  [Err] ORA-06550: line 7, column 2:
  PLS-00103: Encountered the symbol "CREATE" when expecting one of the following:

I'm using a create sequence inside my BEGIN with; and / but did not resolve the error.

 DECLARE 
 v_idMax NUMBER(19,0);

BEGIN
   select max(ID_PROD_PRECO_CUSTO_EMPRESA) INTO v_idMax from 
                           ERP.EST_PROD_PRECO_CUSTO_EMPRESA;

linha 7  create sequence P_P_C_E_seq  start with v_idMax increment by 1;

create or replace trigger PROD_INSERT
before insert on ERP.EST_PROD_PRECO_CUSTO_EMPRESA
for each row
begin
        select P_P_C_E_seq.nextval into :new.ID_PROD_PRECO_CUSTO_EMPRESA from dual;
end;

  FOR V_FUNC IN
    (SELECT  prod.ID_PRODUTO FROM ERP.EST_PRODUTO prod
                INNER JOIN ERP.EST_PROD_PRECO_CUSTO_EMPRESA prodEmp on prodEmp.ID_PRODUTO = prod.ID_PRODUTO
                GROUP BY  prod.ID_PRODUTO
                HAVING COUNT(prodEmp.ID_PRODUTO) !=83) 
  LOOP

            FOR V_FUNC_EMPRESA IN (SELECT DISTINCT emp.ID_EMPRESA FROM ERP.CF_EMPRESA emp
                                            WHERE EMP.ID_EMPRESA NOT IN (select emp.id_empresa FROM ERP.EST_PROD_PRECO_CUSTO_EMPRESA prd
                                            INNER JOIN ERP.EST_PRODUTO prod ON prod.ID_PRODUTO = prd.ID_PRODUTO
                                            INNER JOIN ERP.CF_EMPRESA emp ON prd.ID_EMPRESA = emp.ID_EMPRESA
                                            WHERE prod.ID_PRODUTO = V_FUNC.ID_PRODUTO)
                                            AND EMP.ID_EMPRESA != 110)

                    LOOP
                                INSERT 
                                            INTO EST_PROD_PRECO_CUSTO_EMPRESA 
                                                    (
                                                                                            ID_PRODUTO, 
                                                                                            ID_EMPRESA,
                                                                            CUSTO_OPERACIONAL,
                                                                                 OUTRAS_DESPESAS, 
                                                            PERCENTUAL_OUTRAS_DESPESAS, 
                                                                                         PRECO_CUSTO, 
                                                                             PRECO_CUSTO_FINAL, 
                                                                             PRECO_CUSTO_MEDIO, 
                                                                            TOTAL_OUTROS_CUSTOS,
                                                        OUTROS_CUSTOS_ULTIMA_ENTRADA,
                                                                                                        UUID, 
                                                                        DATA_ULTIMO_REAJUSTE
                                                    )
                                    VALUES
                                        (
                                                        V_FUNC.ID_PRODUTO, 
                                                        V_FUNC_EMPRESA.ID_EMPRESA, 
                                                                0,
                                                                0, 
                                                                0,
                                                                0, 
                                                                0,
                                                                0,
                                                                0, 
                                                                0, 
                                        random_uuid(),
                                                    SYSDATE
                                        )

                        ;

            END LOOP;

  END LOOP;

  drop sequence P_P_C_E_seq 
  drop trigger PROD_INSERT
END;
    
asked by anonymous 13.09.2018 / 16:21

2 answers

4

You can not perform ddl operations directly in a plsql block. The only way to perform this type of operation would be to use the run immediate feature. Ex:

begin
  Execute Immediate 'create or replace trigger PROD_INSERT' ...
end;
    
13.09.2018 / 16:29
1

SOLUTION, vlw to all

DECLARE 
 v_idMax NUMBER(19,0); -- variavel para guardar o ultimo id do banco

BEGIN

  EXECUTE IMMEDIATE 'select max(ID_PROD_PRECO_CUSTO_EMPRESA) from ERP.EST_PROD_PRECO_CUSTO_EMPRESA' INTO v_idMax;
--select max(ID_PROD_PRECO_CUSTO_EMPRESA)   INTO v_idMax from ERP.EST_PROD_PRECO_CUSTO_EMPRESA;

  EXECUTE IMMEDIATE 'create sequence P_P_C_E_seq  start with ' || (v_idMax + 1) ; --||v_idMax ; --INCREMENT BY padrao 1 || A primeira referencia to P_P_C_E_seq.nextval e == v_idMax apos que comeca a adiconar id novo

  EXECUTE IMMEDIATE 'create or replace trigger PROD_INSERT
                                        before insert on ERP.EST_PROD_PRECO_CUSTO_EMPRESA
                                        for each row
                                        begin
                                                select P_P_C_E_seq.nextval into :new.ID_PROD_PRECO_CUSTO_EMPRESA from dual;
                                        end;'; -- trigger para imcrementar o id automaticamente a cada insert


  FOR V_FUNC IN
    (SELECT  prod.ID_PRODUTO FROM ERP.EST_PRODUTO prod
                INNER JOIN ERP.EST_PROD_PRECO_CUSTO_EMPRESA prodEmp on prodEmp.ID_PRODUTO = prod.ID_PRODUTO
                WHERE prod.ID_ADMINISTRACAO = 298
                GROUP BY  prod.ID_PRODUTO
                HAVING COUNT(prodEmp.ID_PRODUTO) !=83) --Numero atual de empresas na hiper festa 12/09/2018
  LOOP

            FOR V_FUNC_EMPRESA IN (SELECT DISTINCT emp.ID_EMPRESA FROM ERP.CF_EMPRESA emp
                                            WHERE EMP.ID_EMPRESA NOT IN (select emp.id_empresa FROM ERP.EST_PROD_PRECO_CUSTO_EMPRESA prd
                                            INNER JOIN ERP.EST_PRODUTO prod ON prod.ID_PRODUTO = prd.ID_PRODUTO
                                            INNER JOIN ERP.CF_EMPRESA emp ON prd.ID_EMPRESA = emp.ID_EMPRESA
                                            WHERE prod.ID_PRODUTO = V_FUNC.ID_PRODUTO) -- tras as empresas do produto que não possuem vinculo na tabela EST_PROD_PRECO_CUSTO_EMPRESA
                                            AND EMP.ID_ADMINISTRACAO = 298) -- empresa inativa da hiper id 110

                    LOOP
                                INSERT 
                                            INTO EST_PROD_PRECO_CUSTO_EMPRESA 
                                                    (
                                                                                            ID_PRODUTO, 
                                                                                            ID_EMPRESA,
                                                                            CUSTO_OPERACIONAL,
                                                                                 OUTRAS_DESPESAS, 
                                                            PERCENTUAL_OUTRAS_DESPESAS, 
                                                                                         PRECO_CUSTO, 
                                                                             PRECO_CUSTO_FINAL, 
                                                                             PRECO_CUSTO_MEDIO, 
                                                                            TOTAL_OUTROS_CUSTOS,
                                                        OUTROS_CUSTOS_ULTIMA_ENTRADA,
                                                                                                        UUID, 
                                                                        DATA_ULTIMO_REAJUSTE
                                                    )
                                    VALUES
                                        (
                                                        V_FUNC.ID_PRODUTO, 
                                                        V_FUNC_EMPRESA.ID_EMPRESA, 
                                                                0,
                                                                0, 
                                                                0,
                                                                0, 
                                                                0,
                                                                0,
                                                                0, 
                                                                0, 
                                        random_uuid(), -- FUNCAO JA CADASTRADA
                                                    SYSDATE -- DATA ATUAL
                                        )

                        ;

            END LOOP;

  END LOOP;

  EXECUTE IMMEDIATE 'drop sequence P_P_C_E_seq'; 
  EXECUTE IMMEDIATE 'drop trigger PROD_INSERT';
END;

If you use Hibernate use the Hibernate sequence itself so you do not lose the sequence when you save something to the project.

  

HIBERNATE_SEQUENCE

--User sequence do HIBERNATE_SEQUENCE
-- EXECUTE IMMEDIATE 'select max(ID_PROD_PRECO_CUSTO_EMPRESA) from ERP.EST_PROD_PRECO_CUSTO_EMPRESA' INTO v_idMax;
--select max(ID_PROD_PRECO_CUSTO_EMPRESA)   INTO v_idMax from ERP.EST_PROD_PRECO_CUSTO_EMPRESA;

--EXECUTE IMMEDIATE 'create sequence P_P_C_E_seq  start with ' || (v_idMax + 1) ; --||v_idMax ; --INCREMENT BY padrao 1 || A primeira referencia to P_P_C_E_seq.nextval e == v_idMax apos que comeca a adiconar id novo

EXECUTE IMMEDIATE 'create or replace trigger PROD_INSERT
                                        before insert on ERP.EST_PROD_PRECO_CUSTO_EMPRESA
                                        for each row
                                        begin
                                                select HIBERNATE_SEQUENCE.nextval into :new.ID_PROD_PRECO_CUSTO_EMPRESA from dual;
                                        end;'; -- trigger para imcrementar o id automaticamente a cada insert
    
13.09.2018 / 21:24