Skip to content

Commit

Permalink
feat: Functions ProgBD - question 2 - week 10
Browse files Browse the repository at this point in the history
  • Loading branch information
ManoMax authored Jun 3, 2021
1 parent 41e0f6b commit 21be277
Showing 1 changed file with 67 additions and 0 deletions.
67 changes: 67 additions & 0 deletions progBD/week10q2.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/*
Adicione ao pacote DDPACK uma função GENERATESTAT para gerar estatísticas sobre todas as tabelas do usuário.
Essas estatísticas incluem informações sobre o número de linhas de uma tabela, a distribuição dos dados, etc.
e são úteis para o Otimizador de Consultas do Oracle.
A função não recebe parâmetros e deve retornar um inteiro que corresponde ao número de tabelas que tiveram estatísticas geradas.
Para tal, use os comandos ANALYZE TABLE .. GENERATE STATISTICS e EXECUTE IMMEDIATE.
Recrie tanto a especificação quanto o corpo do pacote DDPACK.
Execute a função empacotada GENERATESTAT a partir de um bloco anônimo.
Mostre código e resultado da execução.
*/

-- Tive problemas com a compilação desse programa.
-- Mais uma vez, situações pessoais me atrapalharam,
-- mas, para não ficar em branco, aqui está o resultado do que fiz:

-- Especificação do Pacote:

CREATE OR REPLACE PACKAGE DDPACK IS
CURSOR o1 (name_of_obj VARCHAR2) IS
SELECT object_name, status
FROM user_objects
WHERE object_type = name_of_obj AND status = 'INVALID';
CURSOR nomes_tabelas IS
SELECT table_name
FROM user_tables;
PROCEDURE GETINVALIDOBJ (obj_name VARCHAR);
FUNCTION GENERATESTAT RETURN INTEGER;
END DDPACK;

-- Corpo do Pacote:

CREATE OR REPLACE PACKAGE BODY DDPACK IS
obj_name VARCHAR2(30);
obj_status VARCHAR2(7);
nome_tabela1 VARCHAR2(30);

PROCEDURE GETINVALIDOBJ
(name_of_obj VARCHAR2) IS
BEGIN
OPEN o1 (name_of_obj);
LOOP
FETCH o1 INTO obj_name, obj_status;
EXIT WHEN (o1%NOTFOUND);
DBMS_OUTPUT.PUT_LINE(obj_name || ' ' || obj_status);
END LOOP;
CLOSE o1;
END GETINVALIDOBJ;

FUNCTION GENERATESTAT RETURN INTEGER IS
num_tabelas NUMBER;
estatistica VARCHAR2(255);
BEGIN
num_tabelas := 0;
OPEN nomes_tabelas;
LOOP
FETCH nomes_tabelas INTO nome_tabela1;
EXIT WHEN (nomes_tabelas%NOTFOUND);
estatistica := 'ANALYZE TABLE ' || nome_tabela1 || ' COMPUTE STATISTICS';
EXECUTE IMMEDIATE estatistica;
num_tabelas := num_tabelas + 1;
END LOOP;
CLOSE o1;
return num_tabelas;
END GENERATESTAT;
END DDPACK;

0 comments on commit 21be277

Please sign in to comment.