Stored-procedures são programas armazenados diretamente no banco de dados que podem ser escritos em linguagem nativa do banco de dados ou não. Em bases de dados Oracle é possível criar esses programas em linguagem PL/SQL e também em Java. A maioria dos bancos de dados atuais suportam stored-procedures.
Algumas vantagens na sua utilização:
- são executadas diretamente no servidor do banco de dados, fazendo uso dos recursos deste equipamento;
- são armazenadas em formato compilado, dispensando a necessidade do parse dos comandos a cada execução;
- a lógica de negócio fica centralizada e poderá ser reutilizada por diversos usuários e aplicações;
- provê maior segurança encapsulando os objetos que serão acessados.
É possível a partir de um programa escrito em Progress 4GL utilizar stored-procedures armazenadas em bases de dados acessíveis via Dataserver. Isso permite realizar consultas complexas, utilizando a eficiência das linguagens nativas desses bancos de dados e aproveitar o seu resultado em aplicações Progress.
A seguir veremos um exemplo utilizando stored-procedure armazenada em uma base de dados Oracle que retorna as quantidades de pedidos agrupados por mês. Utilizaremos neste exemplo o banco de dados Oracle 10g release 2 com Progress 10.1C. A tabela que armazena essas informações possui a seguinte estrutura:

Esta tabela faz parte do bando de dados de exemplo disponível com a instalação do Oracle.
A seguir a definição da stored-procedure. Observe que optei por criá-la em uma package, não sendo isso um requisito para o funcionamento do nosso exemplo.

As packages (pacotes) do Oracle são agrupamentos de stored-procedures que permitem uma melhor organização desses objetos. Por exemplo, posso construir uma package com as stored-procedures da área de vendas e outra package com as stored-procedures da área de recursos humanos.
A seguir o programa desenvolvido em Progress 4GL que utiliza esta stored-procedure:

Observe neste código que a cláusula LOAD-RESULT-INTO <handle_temp_table> permite direcionar o retorno desta stored-procedure para uma tabela temporária do Progress, possibilitando assim manipular este resultado da forma que achar mais adequada. Isso é novo no Progress 10, até a versão 9 não conseguíamos quebrar este resultado em uma tabela automaticamente.
O programa passa uma data de início e fim como parâmetros para a stored-procedure get_orders_by_month, período este desejado para a nossa consulta.
A seguir o resultado apresentado em tela pelo nosso programa Progress:

Em cada linha deste resultado temos o mês da venda, a quantidade de vendas daquele mês, a quantidade de vendas do mês imediatamente anterior e também a quantidade de vendas do mês imediatamente posterior ao mês corrente. Consultando a definição da stored-procedure observe que este resultado foi alcançado de forma muito simples graças ao poder das linguagens de consulta destes bancos, neste caso com operadores LAG e LEAD da linguagem PL/SQL do Oracle.
Embora este exemplo limite-se a uma operação de consulta, stored-procedures podem efetuar também alterações na base de dados, como inserção, alteração e exclusão de registros, podendo serem utilizadas com um programa 4GL semelhante ao exposto aqui.
Mais informações sobre a sintaxe Progress necessária para executar stored-procedures podem ser obtidas nos manuais do Dataserver Oracle e Dataserver SQL Server.
Informações sobre a linguagem PL/SQL do Oracle poder ser obtida no site de documentações da Oracle ou nos diversos sites disponíveis com conteúdo relacionado.