SQL DINÂMICO

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
gpacheco
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Seg, 04 Abr 2016 3:54 pm

Fala galera. Boa tarde a todos.
Sou novo com programação PL/SQL e estou precisando de ajuda.

preciso criar uma procedure para deletar dados e executar commit a cada X números de linhas. Bom até ai foi tranquilo, porem minha ideia é criar uma variavel do tipo (vTBL) onde eu possa passar o nome da tabela dinamicamente. Fiz isso e executei o comando. Funcionou parcialmente. Vou colocar a primeira procedure que fiz e a segunda com a alteração.

--@P1

Selecionar tudo

1 SET SERVEROUTPUT ON 
2 DECLARE
3 TYPE RI IS TABLE OF ROWID;
4  ROWIDS RI;
5  linhas INTEGER :=0;
6  linhascommmit INTEGER:=20000;
7  vTBL VARCHAR2(20):='C_L_PRSN_DTL';
8 BEGIN
9  SELECT ROWID BULK COLLECT INTO ROWIDS FROM [color=#BF0000]C_L_PRSN_DTL[/color] WHERE SRC_SYS_BU = (SELECT * FROM   OW_MDMDEV.TBL_DQ_CONTROL_BU);
10  FOR I in ROWIDS.FIRST .. ROWIDS.LAST 
11   LOOP 
12      EXECUTE IMMEDIATE 'DELETE ' || vTBL ||' WHERE ROWID = '''||ROWIDS(I)||'''';
13       IF MOD(linhas,linhascommmit)=0 then 
14          COMMIT;
15       END IF;
16      linhas := linhas + 1;
17    END LOOP;
18 END;
--@P2

Selecionar tudo

1 SET SERVEROUTPUT ON 
2 DECLARE
3  TYPE RI IS TABLE OF ROWID;
4  ROWIDS RI;
5  linhas INTEGER :=0;
6  linhascommmit INTEGER:=20000;
7  vTBL VARCHAR2(20):='C_L_PRSN_DTL';
8 BEGIN
9  SELECT ROWID BULK COLLECT INTO ROWIDS FROM vTBL WHERE SRC_SYS_BU = (SELECT * FROM OW_MDMDEV.TBL_DQ_CONTROL_BU);
10  FOR I in ROWIDS.FIRST .. ROWIDS.LAST 
11    LOOP 
12      EXECUTE IMMEDIATE 'DELETE ' || vTBL ||' WHERE ROWID = '''||ROWIDS(I)||'''';
13        IF MOD(linhas,linhascommmit)=0 then 
14          COMMIT;
15       END IF;
16      linhas := linhas + 1;
17    END LOOP;
18 END;
A diferença da @P1 para @P2 é que na linha 9 onde tinha o nome da tabela eu coloquei a variável. Quando executo retorna a mensagem

Selecionar tudo

PL/SQL: ORA-00942: table or view does not exist. 
Eu acredito que seja porque, o da valor variável não seja um objeto de banco no caso (Tabela). Então tentei fazer mais uma teste, vejam o exemplo a seguir:

--@P3

Selecionar tudo

1 SET SERVEROUTPUT ON 
2 DECLARE
3  TYPE RI IS TABLE OF ROWID;
4  ROWIDS RI;
5  linhas INTEGER :=0;
6  linhascommmit INTEGER:=20000;
7  vTBL VARCHAR2(20):='C_L_PRSN_DTL';
8 BEGIN
9  EXECUTE IMMEDIATE 'SELECT ROWID BULK COLLECT INTO ROWIDS FROM '|| vTBL ||' WHERE SRC_SYS_BU = (SELECT * FROM OW_MDMDEV.TBL_DQ_CONTROL_BU)';
10  FOR I in ROWIDS.FIRST .. ROWIDS.LAST 
11    LOOP 
12      EXECUTE IMMEDIATE 'DELETE ' || vTBL ||' WHERE ROWID = '''||ROWIDS(I)||'''';
13        IF MOD(linhas,linhascommmit)=0 then 
14          COMMIT;
15       END IF;
16      linhas := linhas + 1;
17    END LOOP;
18 END;
Acreditando que funcionaria fiz uma alteração na linha 9, onde coloquei um sql dinâmico, porem não funcionou. Imaginei que a logica seria a mesma que empreguei na linha 12.

Desde já agradeço a atenção de todos.
Forte abraço.

Obs: coloquei em anexo o arquivo contem os comando.

Giovani Winter :D :D
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá Giovanni,

Tudo bem?

Acredito que o mais correto seria usar o conceito de SQL DINÂMICO, abrindo um cursor baseado em uma querie dinâmica.

Veja se você consegue tirar algumas idéias a partir destes artigos:

http://www.devmedia.com.br/sql-dinamico ... rte-3/6452
https://oracle-base.com/articles/8i/native-dynamic-sql

Abraços,

Sergio Coutinho
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 10 visitantes