Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Alexandre Garcia

execute immediate

Recommended Posts

Olá,

Estou tentando fazer uma rotina que receba um nome qualquer e "descubra" se se trata de tabela, índice ou constraint. Assuma que somente nomes existentes serão fornecidos. A rotina deve informar o nome do objeto e seu tipo descoberto. Se for uma tabela, também deve mostrar quantas linhas possui.

 

Estou com a seguinte dificuldade. Não estou conseguindo mostrar quantas linhas a tabela possui. 

 

CREATE OR REPLACE PROCEDURE Verifica (busca VARCHAR2) 
IS
cursor c_busca(busca in VARCHAR2)
  IS
   SELECT object_name, object_type
   FROM all_objects
   WHERE object_name LIKE busca||'%';
   
  v_temp_var1 all_objects.object_name%TYPE;
  v_temp_var2 all_objects.object_type%TYPE;
  
  in_table_count number;
  sql_stmt varchar2(300);
 
BEGIN
  
  OPEN c_busca(busca);
    LOOP
      FETCH c_busca INTO v_temp_var1, v_temp_var2;
      EXIT WHEN c_busca%NOTFOUND;
          IF v_temp_var2 LIKE 'TABLE' THEN
            dbms_output.put_line(v_temp_var1 ||' eh** uma:' || v_temp_var2);

            sql_stmt := 'select count(*) from '|| v_temp_var1;
          execute immediate sql_stmt into in_table_count;

            dbms_output.put_line(sql_stmt);
          ELSE
            dbms_output.put_line(v_temp_var1 ||' eh** uma:' || v_temp_var1);
          end if;
    END LOOP;
  CLOSE c_busca;
  
END ;

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente

 

          sql_stmt := 'select count(*) from '|| v_temp_var1;
          execute immediate sql_stmt into in_table_count;
          dbms_output.put_line(in_table_count);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Motta.

 

Acho que na tentativa de buscar o problema eu troquei as variáveis e não estava me atentando ao erro real. Fiz a correção que você indicou mas continuou o erro real.

 

"Error starting at line 2 in command:
EXECUTE Verifica ('DEFAULT_PWD$');
Error report:
ORA-00942: table or view does not exist
ORA-06512: at "SYSTEM.VERIFICA", line 25
ORA-06512: at line 1
00942. 00000 -  "table or view does not exist"
*Cause:    
*Action:
DEFAULT_PWD$ eh** uma:TABLE
select count(*) from DEFAULT_PWD$"

 

Por algum motivo, provavelmente permissão do usuário ou alguma role, o select count(*) from DEFAULT_PWD$ não esta rodando nessa conexão:

image.png.00b056abb6873863bb2d2c7aaec34158.png 

 

Já nessa conexão o select count(*) from DEFAULT_PWD$ roda.

image.png.376bf8b815aa556c491e39567fedb3d4.png

 

Porem quando executo a procedure tenho seguinte erro.

image.png.aa87d0d9bec4c4b52714f0a3113f9dbf.png

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta procedure existe ?

Você está executandando no mesmo user ?

Está criando objetos de usuário na Systrem ? 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta procedure existe ? Sim ela existe mas criada pelo system.

Você está executandando no mesmo user ? Não. Tentei executar com um usuário diferente. Estou vendo como vou fazer para a procedure conte a linhas mesmo de tabelas que não tem como onwer o próprio system.

Está criando objetos de usuário na Systrem ? Sim.

 

Percebi que quando mando listar todos os objetos da all_objects, os objetos que tem como owner não só o system também são listados e esses objetos dão erro na hora do count.

 

Se passo o nome de uma tabela que tem como owner o system a procedure o system, tudo funciona perfeitamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dê GRANT de EXECUTE da VERIFICA para o user em questão.

 

faça

 

begin

  system.verifica('DEFAULT_PWD$');

end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não viu entrar no mérito de objetos de usuário na System.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por tsilva141650
      Bom dia!
      Estou precisando transformar o resultado do meu cursor em forma de tabela como se estivesse efetuando um select.
      No exemplo abaixo criei uma procedure onde ira executar um execute immediate que ira variar, ou seja, não vou saber qual colunas serão necessárias.
      O retorno desta função é um cursor onde consigo visualizar os resultados com o comando print.
      Como poderia visualizar estes dados em forma de tabela?
       
      create or replace PROCEDURE TESTE (ID NUMBER,RETORNO OUT SYS_REFCURSOR)
      IS
      SCRIPT CLOB;
      BEGIN
          SCRIPT:= 'SELECT * FROM USER_TABLESPACES' ;
          EXECUTE IMMEDIATE SCRIPT;
          OPEN RETORNO FOR SCRIPT;
      END;
       
       
      var rc refcursor;
      execute TESTE(2,:rc);
      print rc ;
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.