Object-PL/SQL
- Artigo
- Discussão
Ferramentas
Geral
Imprimir/exportar
Object-PL/SQL (Object-Procedural Language/Structured Query Language ou simplesmente O-PL/SQL) é uma metodologia de uso da linguagem procedural estendida SQL do Oracle.[1] Os itens adicionais a partir da versão 7 e outros upgrades levaram a um uso em larga escala deste banco de dados no paradigma orientado a objetos.[2]
Apesar de a sintaxe do PL/SQL ter sido inicialmente concebida semelhantemente à da Ada e à do Pascal, os avanços posteriores incluíram a possibilidade de uso do código java embutido[3] e de uma sintaxe orientada a objetos no próprio código SQL.[4]
A mixagem e uso embutido de triggers e stored procedures foi um dos pontos que levaram ao limiar da concepção do PL/SQL num paradigma OO.[5] Já a inclusão, na sintaxe SQL, de partículas no formato [classe].[objeto], bem como a implementação do objeto tipo (tipo de dado)[6] (como nas linguagens OO em geral) completou os mínimos requisitos para um mapeamento objeto-relacional numa linguagem SQL estendida sem uso de Persistence frameworks.[7]
A O-PSL/SQL não é somente uma versão da linguagem de programação, mas um modelo de como usá-la, que rompe totalmente com a prática anterior, o que define a autonomia do tema aqui tratado.[8] Cada versão da PL/SQL, a partir da 7, traz inovações que não podem ser tratadas como simples sub-temas da linguagem, caracterizando-se esse conjunto de mudanças como uma linguagem autônoma. Tal revolução estabelece uma fronteira entre a linguagem anterior, procedural-estruturada, e a atual, procedural-estruturada-OO. É justamente esta abordagem que confere importância ao tema e sua notoriedade é dada pelo seu uso cada vez maior.[9]
Numa linguagem OO que tem como objetivo agir sobre um banco de dados, há dois conceitos diferentes chamados objeto, que não devem ser confundidos. Esta distinção é muito importante, já que ambas as significâncias são amplamente usadas. Assim, ao ler a documentação, é preciso fazer a identificação de qual definição é aplicável em cada referência ao termo.
Objetos de banco de dados são elementos que remontam ao modelo relacional ou ainda mais remotamente aos bancos de dados sequenciais e hierárquicos e que continuam presentes no banco de dados orientado a objetos. Tabelas, Triggers, colunas, índices são exemplos de alguns desses objetos,[6] que estão presentes na O-PL/SQL, e cujo valor pode coincidir com o de um objeto na noção java, mais especificamente um elemento de um conjunto (classe), cuja existência se inicia com a operação chamada instanciar.
PL/SQL é a linguagem SQL estendida usada pelo banco de dados Oracle.
O-PL/SQL é disponível no Oracle desde a versão 7 e no IBM DB2 desde a versão 9.7.[10]
O-PL/SQL permite definição de classes e instanciar objetos, assim, criando tipos de dados definidos por usuário, bem como criando construtores, além das stored procedures e triggers em java embutido.
Um pequeno exemplo da sintaxe da O-PL/SQL, extraída da documentação[11], além de outras fontes:
Um exemplo simples de object-oriented PL/SQL[12]
create or replace type base_type as object ( a number, constructor function base_type return self as result, member function func return number, member procedure proc (n number)) instantiable not final;/
Agora, a implementação do tipo é criada. Esta implementação define como as funções do tipo e seus construtores explícitos funcionam:
create or replace type body base_type as constructor function base_type return self as result is begin a:=0; return; end base_type; member function func return number is begin return a; end func; member procedure proc (n number) as begin a:=n; end proc;end;/
Estamos prontos para derivar o tipo-base. A palavra-chave para a derivação é under. O tipo derivado define um novo atributo (chamado m) e sobrescreve a função.
create or replace type deriv_type under base_type ( m number, overriding member function func return number);/
Como nos casos de tipo-base, o método sobrescrito deve ser implementado no tipo derivado:
create or replace type body deriv_type as overriding member function func return number is begin return m*a; end;end;/
Os tipos criados podem ser instanciados e os métodos podem ser chamados:
declare b1 base_type :=base_type(); b2 base_type :=base_type(4); d1 deriv_type:=deriv_type(5,6); d2 deriv_type:=deriv_type(5,6);begin dbms_output.put_line(b1.func); dbms_output.put_line(b2.func); d1.proc(4); dbms_output.put_line(d1.func); dbms_output.put_line(d2.func);end;/
Resultados:
Os tipos criados se tornam tipos reais e podem ser usados em tabelas:
create table table_base ( b base_type);declare base base_type := base_type(); deriv deriv_type:= deriv_type(8,9);begin insert into table_base values(base); insert into table_base values(deriv);end;/select t.b.func() from table_base t;T.B.FUNC()
Resultados:
select avg(t.b.func()) from table_base t;AVG(T.B.FUNC())
Resultado:
|isbn=
(ajuda) |coautor=
(ajuda)|coautor=
(ajuda)