Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Instalação de pacotes RODBC/ROracle no OS X Mavericks


Esta resposta abordará a instalação do RODBC e do ROracle no OS X, especificamente no Mavericks e posterior.

Ambos os pacotes agora precisam ser compilados (compilados) a partir da fonte. Isso significa que a primeira coisa que você precisa é baixar o XCode e as "ferramentas de linha de comando" associadas para que você realmente tenha um compilador. A maneira como você faz isso mudou com basicamente todas as versões do OS X/XCode, mas se você começar a pesquisar no Google, provavelmente acabará chegando aqui.

Uma vez que você tem isso no lugar...

RODBC

Desde o OS X 10.9 (Mavericks), a Apple parou de incluir os arquivos de cabeçalho SQL iODBC junto com as "ferramentas de linha de comando" que os usuários de R no OS X estão acostumados a instalar para construir Rpackages a partir da fonte.

Portanto, se você tentar compilar o RODBC a partir da fonte no Mavericks neste momento, deverá receber um erro como:

configure:erro:"Cabeçalhos ODBC sql.h e sqlext.h não encontrados"

Para corrigir isso, você precisa baixar a versão mais recente do iODBC (www.iodbc.org), descompactar o arquivo e definir os caminhos de pesquisa do cabeçalho e da biblioteca para o local onde você colocou o pacote descompactado. Se você não sabe como definir seus caminhos de pesquisa, basta colocar os arquivos de cabeçalho (sql.h e sqlext.h) no /usr/include diretório e o libiodbc.a arquivo no /usr/lib diretório.

Então você deve ser capaz de fazer
install.packages("RODBC",type = "source")

sem quaisquer problemas. Presumivelmente, isso também funcionaria com o outro grande projeto ODBC de código aberto, unixODBC, mas não tentei isso.

Eu testei isso (e o método homebrew em outra resposta) no El Capitan e ambos ainda funcionam.

ROracle

Isso é mais complicado. No entanto, o ROracle pode ser instalado no OS X (eu testei isso no Mountain Lion através do El Capitan). Como o ROracle depende do Oracle Instant Client, não há binários disponíveis para nenhuma plataforma. Há instruções detalhadas de instalação para o pacote aqui.

Para OS X, precisamos (principalmente) seguir as instruções do Linux.

Primeiro, baixe o Oracle Instant Client apropriado, bem como o SDK, conforme indicado nas instruções do Linuz.

As instruções de instalação do Linux mencionam a instalação do cliente a partir de um RPM, que colocará tudo "no lugar certo". Não consegui descobrir se isso se aplicava ao OS X, então simplesmente descompactei o cliente em um diretório que criei e coloquei o SDK dentro desse diretório em /sdk .

As instruções de instalação do Linux nos orientam a criar um link simbólico para libclntsh.so.11.1. Como este é o OS X, na verdade é chamado de libclntsh.dylib.11.1. Então, precisamos cd para o diretório onde descompactamos o cliente e, em seguida, execute
ln -s libclntsh.dylib.11.1 libclntsh.dylib

No OS X, definimos o DYLD_LIBRARY_PATH , não o LD_LIBRARY_PATH :
export DYLD_LIBRARY_PATH=/scratch/instantclient_11_2:$DYLD_LIBRARY_PATH

usando o caminho correto para sua máquina.

Eu nunca consegui fazer o ROracle compilar com um OCI_LIB variável de ambiente. Em vez disso, usei o --with-oci-lib opção de sinalizador do compilador:
R CMD INSTALL --configure-args='--with-oci-lib=/scratch/instantclient_11_2' ROracle_1.1-11.tar.gz

novamente usando qualquer caminho e número de versão do ROracle apropriados.

Se você estiver se conectando a um banco de dados Oracle usando um arquivo tnsnames.ora, também precisará definir uma variável de ambiente TNS_ADMIN para apontar para o local desse arquivo.

Uma última pegadinha:você pode descobrir (como eu fiz) que tudo isso funcionará apenas se você iniciar o R ​​a partir da linha de comando (ou seja, Terminal). Especificamente, se você iniciar RGui.app ou RStudio.app da GUI e, em seguida, tentar executar library(ROracle) você receberá um erro dizendo algo no sentido de
> library("ROracle")
Error in dyn.load(file, DLLpath = DLLpath, ...) : 
  unable to load shared object '/Library/Frameworks/R.framework/Versions/3.1/Resources/library/ROracle/libs/ROracle.so':
  dlopen(/Library/Frameworks/R.framework/Versions/3.1/Resources/library/ROracle/libs/ROracle.so, 6): Library not loaded: /ade/b/3071542110/oracle/rdbms/lib/libclntsh.dylib.11.1
  Referenced from: /Library/Frameworks/R.framework/Versions/3.1/Resources/library/ROracle/libs/ROracle.so
  Reason: image not found
Error: package or namespace load failed for ‘ROracle’

Isso acontecerá mesmo que Sys.getenv("DYLD_LIBRARY_PATH") relata fielmente o caminho correto.

Por um tempo, criei uma "solução" onde criei um script de shell que lançava o RStudio/Rgui na inicialização e só precisava lembrar de sempre iniciá-los posteriormente via
open -a R.app
open -a RStudio.app

O problema aparentemente tem a ver com a forma como as variáveis ​​de ambiente são disponibilizadas para aplicativos iniciados pela GUI no OS X. Como geralmente é o caso, acabei encontrando a solução no StackOverflow. Editando o /etc/launchd.conf file resolveu esse problema, então o ROracle agora carrega mesmo quando o RStudio/RGuiare é iniciado a partir do Finder. Embora note aqui que o /etc/launchd.conf solução não é mais suportada no Yosemite. Essa resposta sugere que agora você precisa configurar um arquivo plist de inicialização apenas para definir o ambiente para launchctl no arranque.

Atualização do El Capitan para ROracle

Eu já passei pelo crisol neste no El Capitan e funciona como descrito acima, mas apenas se você desabilitar a Proteção de integridade do sistema primeiro! Fazer isso é bastante rápido e as instruções são facilmente encontradas no Google.

Ufa.