Executando Processos PL/SQL via JavaScript com Ajax Callback


Quem nunca precisou executar um processo PL/SQL pelo JavaScript no Oracle Apex?

Essa é uma função que mesmo que possa parecer complexa é algo realmente simples de se fazer.

Caso você ainda não esteja familiarizado com o conceito de Ajax Callback e Promisses recomendo a leitura deste artigo aqui antes de prosseguir. 

Para executar um processo com Ajax Callback, iremos utilizar o namespace apex.server.process.

Segundo a documentação da Oracle,

Essa função chama um processo PL/SQL sob demanda (retorno de chamada Ajax) definido no nível da página ou do aplicativo. Essa função é um wrapper da função jQuery.ajax que suporta um subconjunto das opções jQuery.ajax, além de opções adicionais específicas do Application Express.

apex.server.process( pName, pData, pOptions ) → Promise

Recomendo muito a leitura da documentação para compreender a capacidade total dessa função 👍.

Neste exemplo irei demonstrar a utilização do apex.server.process.

Primeiramente crio uma função JavaScript, que passo um código de um item através do parametro X01 e chamo a função callback "PUBLICA_ITEM":

async function publicaItem() {
	let waitPopup = apex.widget.waitPopup();

	await apex.server.process("PUBLICA_ITEM", {
        x01: row.find('td').eq('4').text(),
        dataType: "json"
    }, {
        success: function (data) {
        	waitPopup.remove();
            var region = apex.region("regItens");
            region.refresh();
            apex.message.clearErrors();
            apex.message.showPageSuccess("Publicação realizada com sucesso!");
        },
        error: function (jqXHR, textStatus, errorThrown) {
        	waitPopup.remove();
            apex.message.clearErrors();

            apex.message.showErrors([
                {
                    type: apex.message.TYPE.ERROR,
                    location: ["page"],
                    message: "Erro ao publicar itens: " + errorThrown,
                    unsafe: false
                }
            ]);
        }
    });
}

É possível utilizar os parâmetros x01 - x10 (String) que podem ser acessados no PL/SQL utilizando apex_application.G_X01 - apex_application.G_X10.

Agora crio um novo item Ajax Callback dentro da aba "Processing" com o nome "PUBLICA_ITEM":
begin

if apex_application.G_X01 is not null then
  UPDATE ITEM
     SET ITEM.ST_PUBLICADO = 'S'
   WHERE ITEM.ID = apex_application.G_X01;

  commit;
end if;

apex_json.open_object;  
apex_json.write('success', true);  
apex_json.close_object; 
exception
    when others then
        apex_json.open_object;
        apex_json.write('success', false);
        apex_json.write('message', sqlerrm);
        apex_json.close_object;
END;

É importante salientar que é esperado um retorno da função, nesse exemplo retorno um JSON com o valor success = true, significando que o processamento foi realizado e finalizado com sucesso, ou false quando houver algum erro.

Caso não houver um retorno irá dar um erro SyntaxError: Unexpected end of JSON input.

Por enquanto é apenas isso.

Um passo de cada vez 😄...

Comentários