Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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 ;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:

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

Porem quando executo a procedure tenho seguinte erro.
Esta procedure existe ?
Você está executandando no mesmo user ?
Está criando objetos de usuário na Systrem ?
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.
Dê GRANT de EXECUTE da VERIFICA para o user em questão.
faça
begin
system.verifica('DEFAULT_PWD$');
end;Obrigado Motta! Resolvido.
Não viu entrar no mérito de objetos de usuário na System.
>
14 horas atrás, Motta disse:
Não viu entrar no mérito de objetos de usuário na System.
Não entendi.
Pesquise esre assunto.
Obrigado. Vou pesquisar.
tente