segunda-feira, 22 de março de 2010

Simulando sessão Oracle Application em Ferramentas de acesso a Banco de Dados

Hi!

Algumas vezes necessitamos executar programas ou SELECTS direto no banco de dados, ou seja, por fora do Aplicativo Oracle, através de ferramentas como SQL Navigator, SQL Tools, PL/SQL Developer ou outras ferramentas do gênero. Quase sempre, para VIEWS que são utilizadas no EBS, é necessário que o ambiente esteja com algumas variáveis “setadas” para que possamos visualizar os dados. Caso contrário, nossa QUERY ou programa não retorna nada. Segue abaixo um SCRIPT que sempre uso e que prepara o ambiente como se estivéssemos conectados no Oracle Applications. Ele funciona para 99% dos casos. Salvo outros procedimentos mais específicos que podem ocorrer dependendo do módulo e responsabilidade que desejamos acessar. Execute este SCRIPT na ferramenta que você estiver utilizando para acessar o banco de dados e substitua as varáveis: '&user_name' e '&responsibility_key' pelo nome do usuário e chave da responsabilidade, respectivamente. Este último você encontra no cadastro de responsabilidades no Administrado do Sistema.

declare
  p_application_id     number;
  p_responsibility_id  number;
  p_responsibility_key varchar2(200);
  p_user_id            number;
  p_user_name          varchar2(200);
  p_org_id             number;
begin
  --
  begin
    p_user_name := '&user_name';
    --
    select user_id
    into   p_user_id
    from   fnd_user
    where  user_name = p_user_name;
  exception
    when no_data_found then
      raise_application_error(-20001,'Usuário não encontrado: '||p_user_name);
    when others then
      raise_application_error(-20002,'Erro ao recuperar o id do usuário '||p_user_name||'. Erro: '||sqlerrm);
  end;
  --
  begin
    p_responsibility_key := '&responsibility_key';
    --
    select application_id
          ,responsibility_id
    into   p_application_id
          ,p_responsibility_id
    from   fnd_responsibility
    where  responsibility_key = p_responsibility_key;
  exception
    when no_data_found then
      raise_application_error(-20003,'Responsabilidade não encontrada: '||p_responsibility_key);
    when others then
      raise_application_error(-20004,'Erro ao recuperar o id da responsabilidade '||p_responsibility_key||'. Erro: '||sqlerrm);
  end;
  --
  begin
    fnd_client_info.setup_client_info( p_application_id
                                      ,p_responsibility_id
                                      ,p_user_id
                                      ,0);
  exception
    when others then
      raise_application_error(-20005,'Erro ao configurar variáveis de sessão (FND_CLIENT_INFO.SETUP_CLIENT_INFO). Erro: '||sqlerrm);
  end;
  --
  begin
    fnd_global.apps_initialize( p_user_id
                               ,p_responsibility_id
                               ,p_application_id
                               ,0);
  exception
    when others then
      raise_application_error(-20006,'Erro ao configurar variáveis de sessão (FND_GLOBAL.APPS_INITIALIZE). Erro: '||sqlerrm);
  end;
  --
  begin
    p_org_id := &p_org_id;
    --
    -- Para versão R12 do Oracle Applications (caso não seja, comente esta parte)
    mo_global.set_policy_context( p_access_mode  => 'S'
                                 ,p_org_id       => p_org_id);
  exception
    when others then
      raise_application_error(-20007,'Erro ao configurar variáveis de sessão (MO_GLOBAL.SET_POLICY_CONTEXT). Erro: '||sqlerrm);
  end;
end;


Obs.: Note que existe um adendo no código, para a versão R12 do Oracle Applications.

Falows!

Nenhum comentário:

Postar um comentário