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. 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.

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 e de uma sintaxe orientada a objetos no próprio código SQL.

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. 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) (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.

Autonomia, notoriedade e importância do O-PL/SQL 
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. 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.

Confusão de objetos 
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, 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 e O-PL/SQL 

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.

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.

Exemplo de uso da sintaxe da O-PL/SQL 
Um pequeno exemplo da sintaxe da O-PL/SQL, extraída da documentação, além de outras fontes:

Exemplo 

Um exemplo simples de object-oriented PL/SQLcreate 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:
 0
 4
 24
 30
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:
 0
 72
select avg(t.b.func()) from table_base t;
AVG(T.B.FUNC())
Resultado:
 36

Bibliografia

Ver também 
 Banco de dados relacional
 Banco de dados orientado a componentes
 Transact-SQL
 SGBD

Nota

Ligações externas 
 Examples of O-Pl/SQL

Oracle
SQL
Programação orientada a objetos
Programas de computador da Oracle Corporation