Jump to content

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 ;

Share this post


Link to post
Share on other 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);

Share this post


Link to post
Share on other 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

 

 

 

Share this post


Link to post
Share on other sites

Esta procedure existe ?

Você está executandando no mesmo user ?

Está criando objetos de usuário na Systrem ? 

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

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

 

faça

 

begin

  system.verifica('DEFAULT_PWD$');

end;

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By 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 ;
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.