PL/SQL Anonymous block | PLS-00103: Encountered the Symbol "CREATE" when expecting one of the following:

Asked

Viewed 1,687 times

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:

'Cause I’m using a create Quence inside my BEGIN with ; and / but it didn’t 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;

2 answers

4


It is not possible to perform operations ddl directly into a plsql block. The only way to execute this type of operation would be by using the resource immediate execution . Ex:

begin
  Execute Immediate 'create or replace trigger PROD_INSERT' ...
end;
  • like I started studying PL/SQL yesterday so I’ll ask a few questions. I can do a Begin for each Run within the same DECLARE ? how: begin
 Execute Immediate 'create sequence P_P_C_E_seq start' ...
end; / begin
 Execute Immediate 'create or replace trigger PROD_INSERT' ...
end;

  • 2

    only supplementing in the documentation says the following " Only Dynamic SQL can execute the following types of statements Within PL/SQL program Units: Data Definition language (DDL) statements such as CREATE, DROP, GRANT, and REVOKE Session control language (SCL) statements such as ALTER SESSION and SET ROLE " https://docs.oracle.com/cd/B19306_01/B14251_01/adfns_dynamic_sql.htm

  • @Guilhermeoliveira, answering the question you asked in the answer (it is better to delete it later or replicate it here in the comments). Unfortunately it is only possible to pass parameters in the immediate run to dml and plsql operations (Search for "using" if you want to know more about parameters in excute immediate). In your case you can use an replace in your script. Ex: EXECUTE IMMEDIATE replace('create Sequence P_p_e_seq start with :v_idMax increment by 1', ':v_idMax', to_char(v_idMax));

  • Guy I managed using || EX: EXECUTE IMMEDIATE 'create sequence P_P_C_E_seq start with ' || (v_idMax + 1) ;

1

HICCUP, see you 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 itself so you don’t lose the sequence when saving something in 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

Browser other questions tagged

You are not signed in. Login or sign up in order to post.