SQL DINAMICO com EXECUTE IMMEDIATE

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Avatar do usuário
gpereira
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 61
Registrado em: Sáb, 10 Dez 2011 10:56 am
Gustavo Antonio Pereira
OCA Oracle Database 10g Administrator Certified Associate

Senhores, Boa Tarde como vão?

Estou pela primeira vez utilizando recurso de SQL dinamico, porem enfrentando erros podem me ajudar?

Preciso popular uma tabela de controle com um valor maximo de um campo chamado EXECID. Todas as tabelas de meu schema possui este campo. já populei esta tabela de controle com os nomes das tabelas, porem agora estou desenvolvendo procedure que atualiza o valor maximo deste controle para cada tabela.

Selecionar tudo

CREATE OR REPLACE PROCEDURE PRC_EXECID_CONTROL
IS
vSQL_m VARCHAR2(4000);    
vSQL_c VARCHAR2(4000);    
vMAX   NUMBER;

BEGIN

FOR x IN (SELECT TABLE_NAME FROM EXECID_CONTROL) LOOP

vSQL_m := 'SELECT MAX(EXECID) INTO vMAX FROM ' || x.TABLE_NAME || ';';

EXECUTE IMMEDIATE vSQL_m ;

vSQL_c := 'UPDATE RUNID_CONTROL RC SET RC.MAX_RUNID = vMAX WHERE RC.TABLE_NAME = ' || x.TABLE_NAME || ';';

EXECUTE IMMEDIATE vSQL_c ;

END LOOP;

COMMIT;

END PRC_RUNID_CONTROL;
Ele compila beleza, porem retorna erro abaixo:

Selecionar tudo

Relatório de erro:
ORA-00911: caractere inválido
ORA-06512: em "xxxxx.PRC_EXEC_ID_CONTROL", line 17
ORA-06512: em line 1
00911. 00000 -  "invalid character"
*Cause:    identifiers may not start with any ASCII character other than
           letters and numbers.  $#_ are also allowed after the first
           character.  Identifiers enclosed by doublequotes may contain
           any character other than a doublequote.  Alternative quotes
           (q'#...#') cannot use spaces, tabs, or carriage returns as
           delimiters.  For all other contexts, consult the SQL Language
           Reference Manual.
*Action:
obrigado galera.
Avatar do usuário
gpereira
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 61
Registrado em: Sáb, 10 Dez 2011 10:56 am
Gustavo Antonio Pereira
OCA Oracle Database 10g Administrator Certified Associate

Obrigado pessoal..

Funcionou conforme abaixo:

Selecionar tudo

CREATE OR REPLACE PROCEDURE PRC_EXEC_CONTROL
IS
vSQL_m VARCHAR2(500);
vSQL_c VARCHAR2(500);
vMAX   NUMBER(20);

BEGIN

FOR x IN (SELECT TABLE_NAME FROM RUNID_CONTROL) LOOP

vSQL_m := 'SELECT COALESCE(MAX(EXECID), -99) FROM ' || x.TABLE_NAME ;

EXECUTE IMMEDIATE vSQL_m INTO vMAX ;


vSQL_c := 'UPDATE RUNID_CONTROL SET MAX_EXECID = ' || vMAX || ' WHERE TABLE_NAME = ' || '''' || x.TABLE_NAME || '''' ;

EXECUTE IMMEDIATE vSQL_c ;

END LOOP;

COMMIT ;

END PRC_RUNID_CONTROL;
Abraços.
Responder
  • Informação