Oracle Pacote PL/SQL: Tipo, Especificação, Corpo [Exemplo]

O que é o pacote Oracle?

O pacote PL/SQL é um agrupamento lógico de um subprograma relacionado (procedimento/função) em um único elemento. Um pacote é compilado e armazenado como um objeto de banco de dados que pode ser usado later.

Componentes de Pacotes

O pacote PL/SQL possui dois componentes.

  • Especificação do Pacote
  • Corpo do pacote

Especificação do Pacote

A especificação do pacote consiste em uma declaração de todos os variáveis, cursores, objetos, procedimentos, funções e exceção.

Abaixo estão algumas características da especificação do pacote.

  • Os elementos declarados na especificação podem ser acessados ​​de fora do pacote. Esses elementos são conhecidos como elemento público.
  • A especificação do pacote é um elemento independente, o que significa que pode existir sozinho, sem o corpo do pacote.
  • Sempre que um pacote é referenciado, uma instância do pacote é criada para aquela sessão específica.
  • Depois que a instância for criada para uma sessão, todos os elementos do pacote iniciados nessa instância serão válidos até o final da sessão.

Sintaxe

CREATE [OR REPLACE] PACKAGE <package_name> 
IS
<sub_program and public element declaration>
.
.
END <package name>

A sintaxe acima mostra a criação da especificação do pacote.

Corpo do pacote

Consiste na definição de todos os elementos que estão presentes na especificação do pacote. Também pode ter uma definição de elementos que não estão declarados na especificação, esses elementos são chamados de elementos privados e podem ser chamados apenas de dentro do pacote.

Abaixo estão as características de um corpo de pacote.

  • Deve conter definições para todos os subprogramas/cursores que foram declarados na especificação.
  • Também pode ter mais subprogramas ou outros elementos que não estão declarados na especificação. Estes são chamados de elementos privados.
  • É um objeto confiável e depende da especificação do pacote.
  • O estado do corpo do pacote torna-se 'Inválido' sempre que a especificação é compilada. Portanto, ele precisa ser recompilado sempre após a compilação da especificação.
  • Os elementos privados devem ser definidos primeiro, antes de serem usados ​​no corpo do pacote.
  • A primeira parte do pacote é a parte da declaração global. Isto inclui variáveis, cursores e elementos privados (declaração direta) que são visíveis para todo o pacote.
  • A última parte do pacote é a parte de inicialização do pacote, que é executada uma vez sempre que um pacote é referido pela primeira vez na sessão.

Sintaxe:

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<global_declaration part>
<Private element definition>
<sub_program and public element definition>
.
<Package Initialization> 
END <package_name>
  • A sintaxe acima mostra a criação do corpo do pacote.

Agora veremos como fazer referência aos elementos do pacote no programa.

Referindo Elementos do Pacote

Uma vez que os elementos são declarados e definidos no pacote, precisamos referenciá-los para utilizá-los.

Todos os elementos públicos do pacote podem ser consultados chamando o nome do pacote seguido pelo nome do elemento separado por ponto, ou seja, ' . '.

A variável pública do pacote também pode ser usada da mesma maneira para atribuir e buscar valores deles, ou seja, ' . '.

Criar pacote em PL/SQL

Em PL/SQL sempre que um pacote é referido/chamado em uma sessão, uma nova instância será criada para esse pacote.

Oracle fornece um recurso para inicializar elementos do pacote ou realizar qualquer atividade no momento da criação desta instância por meio de 'Inicialização do pacote'.

Isso nada mais é do que um bloco de execução escrito no corpo do pacote após definir todos os elementos do pacote. Este bloco será executado sempre que um pacote for referenciado pela primeira vez na sessão.

Sintaxe

Criar pacote em PL/SQL

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element definition>
<sub_program and public element definition>
.
BEGINE
<Package Initialization> 
END <package_name>
  • A sintaxe acima mostra a definição de inicialização do pacote no corpo do pacote.

Declarações para a frente

A declaração/referência direta no pacote nada mais é do que declarar os elementos privados separadamente e defini-los no later parte do corpo do pacote.

Elementos privados só podem ser referenciados se já estiverem declarados no corpo do pacote. Por esse motivo, a declaração direta é usada. Mas é bastante incomum de usar porque na maioria das vezes os elementos privados são declarados e definidos na primeira parte do corpo do pacote.

A declaração futura é uma opção fornecida por Oracle, não é obrigatório e usar e não usar fica a critério do programador.

Declarações para a frente

Sintaxe:

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element declaration>
.
.
.
<Public element definition that refer the above private element>
.
.
<Private element definition> 
.
BEGIN
<package_initialization code>; 
END <package_name>

A sintaxe acima mostra a declaração direta. Os elementos privados são declarados separadamente na parte anterior do pacote e foram definidos no later parte.

Uso de cursores no pacote

Ao contrário de outros elementos, é preciso ter cuidado ao usar cursores dentro do pacote.

Se o cursor estiver definido na especificação do pacote ou na parte global do corpo do pacote, então o cursor, uma vez aberto, persistirá até o final da sessão.

Portanto, deve-se sempre usar os atributos do cursor '%ISOPEN' para verificar o estado do cursor antes de referenciá-lo.

Sobrecarregando

Sobrecarga é o conceito de ter muitos subprogramas com o mesmo nome. Esses subprogramas serão diferentes entre si por um número de parâmetros ou tipos de parâmetros ou tipo de retorno, ou seja, subprogramas com o mesmo nome, mas com número diferente de parâmetros, tipos diferentes de parâmetros ou redigitações diferentes são considerados sobrecarga.

Isto é útil quando muitos subprogramas precisam realizar a mesma tarefa, mas a forma de chamar cada um deles deve ser diferente. Neste caso, o nome do subprograma será mantido igual para todos e os parâmetros serão alterados conforme a instrução de chamada.

Exemplo 1: Neste exemplo, vamos criar um pacote para obter e definir os valores das informações do funcionário na tabela 'emp'. A função get_record retornará a saída do tipo de registro para o número de funcionário fornecido, e o procedimento set_record inserirá o registro do tipo de registro na tabela emp.

Passo 1) Criação de especificação de pacote

Sobrecarregando

CREATE OR REPLACE PACKAGE guru99_get_set
IS
PROCEDURE set_record (p_emp_rec IN emp%ROWTYPE);
FUNCTION get record (p_emp no IN NUMBER) RETURN emp%ROWTYPE;
END guru99_get_set:
/

Saída:

Package created

Explicação do código

  • Linha de código 1-5: Criando a especificação do pacote para guru99_get_set com um procedimento e uma função. Estes dois são agora elementos públicos deste pacote.

Passo 2) O pacote contém o corpo do pacote, onde serão definidas todas as definições reais de procedimentos e funções. Nesta etapa, o Corpo do Pacote é criado.

Sobrecarregando

CREATE OR REPLACE PACKAGE BODY guru99_get_set
IS	
PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO emp
VALUES(p_emp_rec.emp_name,p_emp_rec.emp_no; p_emp_rec.salary,p_emp_rec.manager);
COMMIT;
END set_record;
FUNCTION get_record(p_emp_no IN NUMBER)
RETURN emp%ROWTYPE
IS
l_emp_rec emp%ROWTYPE;
BEGIN
SELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_no
RETURN l_emp_rec;
END get_record;
BEGUN	
dbms_output.put_line(‘Control is now executing the package initialization part');
END guru99_get_set:
/

Saída:

Package body created

Explicação do código

  • Linha de código 7: Criando o corpo do pacote.
  • Linha de código 9-16: Definindo o elemento 'set_record' que é declarado na especificação. Isso é o mesmo que definir o procedimento independente em PL/SQL.
  • Linha de código 17-24: Definindo o elemento 'get_record'. É o mesmo que definir a função autônoma.
  • Linha de código 25-26: Definindo a parte de inicialização do pacote.

Passo 3) Criando um bloco anônimo para inserir e exibir os registros consultando o pacote criado acima.

Sobrecarregando

DECLARE
l_emp_rec emp%ROWTYPE;
l_get_rec emp%ROWTYPE;
BEGIN
dbms output.put line(‘Insert new record for employee 1004');
l_emp_rec.emp_no:=l004;
l_emp_rec.emp_name:='CCC';
l_emp_rec.salary~20000;
l_emp_rec.manager:=’BBB’;
guru99_get_set.set_record(1_emp_rec);
dbms_output.put_line(‘Record inserted');
dbms output.put line(‘Calling get function to display the inserted record'):
l_get_rec:=guru99_get_set.get_record(1004);
dbms_output.put_line(‘Employee name: ‘||l_get_rec.emp_name);
dbms_output.put_line(‘Employee number:‘||l_get_rec.emp_no);
dbms_output.put_line(‘Employee salary:‘||l_get_rec.salary');
dbms output.put line(‘Employee manager:‘||1_get_rec.manager);		
END:
/

Saída:

Insert new record for employee 1004
Control is now executing the package initialization part
Record inserted
Calling get function to display the inserted record
Employee name: CCC
Employee number: 1004
Employee salary: 20000
Employee manager: BBB

Explicação do código:

  • Linha de código 34-37: Preencher os dados da variável do tipo de registro em um bloco anônimo para chamar o elemento 'set_record' do pacote.
  • Linha de código 38: A chamada foi feita para 'set_record' do pacote guru99_get_set. Agora o pacote está instanciado e persistirá até o final da sessão.
  • A parte de inicialização do pacote é executada, pois esta é a primeira chamada do pacote.
  • O registro é inserido pelo elemento 'set_record' na tabela.
  • Linha de código 41: Chamando o elemento ‘get_record’ para exibir o details do funcionário inserido.
  • O pacote é referido pela segunda vez durante a chamada 'get_record' para o pacote. Mas a parte de inicialização não é executada desta vez porque o pacote já foi inicializado nesta sessão.
  • Linha de código 42-45: Imprimindo o funcionário details.

Dependência em Pacotes

Como o pacote é o agrupamento lógico de coisas relacionadas, ele possui algumas dependências. Sigawing são a dependência que deve ser cuidada.

  • Uma especificação é um objeto independente.
  • O corpo de um pacote depende da especificação.
  • O corpo do pacote pode ser compilado separadamente. Sempre que a especificação é compilada, o corpo precisa ser recompilado, pois se tornará inválido.
  • O subprograma no corpo do pacote que depende de um elemento privado deve ser definido somente após a declaração do elemento privado.
  • Os objetos de banco de dados mencionados na especificação e no corpo precisam estar com status válido no momento da compilação do pacote.

Informações do pacote

Depois que as informações do pacote são criadas, as informações do pacote, como fonte do pacote, subprograma detailse sobrecarga details estão disponíveis no Oracle tabelas de definição de dados.

A tabela abaixo fornece a tabela de definição de dados e as informações do pacote que estão disponíveis na tabela.

Nome da tabela Descrição pergunta
ALL_OBJECT Dá o details do pacote como object_id, Creation_date, last_ddl_time, etc. Ele conterá os objetos criados por todos os usuários. SELECT * FROM all_objects onde object_name =' '
USER_OBJECT Dá o details do pacote como object_id, Creation_date, last_ddl_time, etc. Ele conterá os objetos criados pelo usuário atual. SELECT * FROM user_objects onde object_name =' '
ALL_SOURCE Fornece a origem dos objetos criados por todos os usuários. SELECIONE * FROM all_source onde nome=' '
USER_SOURCE Fornece a origem dos objetos criados pelo usuário atual. SELECIONE * FROM user_source onde nome=' '
TODOS_PROCEDIMENTOS Fornece o subprograma details como object_id, sobrecarga details, etc criado por todos os usuários. SELECIONE *FROM todos_procedimentos
Onde object_name=' '
USER_PROCEDURES Fornece o subprograma details como object_id, sobrecarga details, etc. criado pelo usuário atual. SELECIONE *FROM user_procedures
Onde object_name=' '

ARQUIVO UTL – Uma Visão Geral

Arquivo UTL é o pacote de utilitários separado fornecido por Oracle para realizar tarefas especiais. Isso é usado principalmente para ler e gravar arquivos do sistema operacional de pacotes ou subprogramas PL/SQL. Ele tem funções separadas para colocar as informações e obter as informações dos arquivos. Também permite ler/escrever no conjunto de caracteres nativo.

O Programador pode usar isso para gravar arquivos do sistema operacional de qualquer tipo e o arquivo será gravado diretamente no servidor de banco de dados. O nome e o caminho do diretório serão mencionados no momento da escrita.

Resumo

Agora aprendemos os pacotes em PL/SQL, e agora você deve ser capaz de trabalhar no seguintewing.

  • Pacotes PL/SQL e seus componentes
  • Características dos pacotes
  • Referindo e sobrecarregando elementos do pacote
  • Gerenciando dependências em pacotes
  • rivalizarwing informações do pacote
  • O que é arquivo UTL