使用root权限分别对下面两个文件进行配置
配置/etc/odbcinst.ini文件
[Oracle 10g ODBC Driver]
Description = Oracle ODBC 10g
Driver = /oracle/product/10.2.0/db_1/lib/libsqora.so.10.1
Driver64 =
Setup = /usr/lib/liboraodbcS.a
Setup64 =
UsageCount =
CPTimeout =
CPReuse =
配置/etc/odbc.ini
[linxiaojie_orcl]
Description = Oracle 10g ODBC Driver
Driver = Oracle 10g ODBC Driver
DB = orcl
USERID = scott
PASSWORD = tiger
ORACLE_HOME =/oracle/product/10.2.0/db_1
TNS_ADMIN =/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora
对配置是否正确时行测试时,发现如下问题:
[linxj@localhost Oracle]$ isql -v linxiaojie_orcl
[08004][unixODBC][Oracle][ODBC][Ora]ORA-01034: ORACLE not available
ORA-27121: unable to determine size of shared memory segment
Linux Error: 13: Permission denied
[ISQL]ERROR: Could not SQLConnect
主要是因为oracle安装程序没有给oracle这个可执行程序设置正确的setuid。这样设置一下:
$ cd $ORACLE_HOME/bin
$ chmod 6751 oracle
结果类似这样就行了。
$ ls -l $ORACLE_HOME/bin/oracle
-rwsr-s--x 1 oracle oinstall 23352783 Aug 14 2001 /home/oracle/app/oracle/product/8.1.6/bin/oracle
正确执行后:
[linxj@localhost Oracle]$ isql -v linxiaojie_orcl
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select * from emp;
+-------+-----------+----------+-------+--------------------+----------+----------+-------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO|
+-------+-----------+----------+-------+--------------------+----------+----------+-------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00| 800 | | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00| 1600 | 300 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00| 1250 | 500 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00| 2975 | | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00| 1250 | 1400 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00| 2850 | | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00| 2450 | | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00| 3000 | | 20 |
| 7839 | KING | PRESIDENT| | 1981-11-17 00:00:00| 5000 | | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00| 1500 | 0 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00| 1100 | | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00| 950 | | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00| 3000 | | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00| 1300 | | 10 |
+-------+-----------+----------+-------+--------------------+----------+----------+-------+
SQLRowCount returns -1
14 rows fetched
SQL>
编写程序:
testODBCConnectOracle.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sql.h"
#include "sqlext.h"
int main(void)
{
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLINTEGER len;
SQLCHAR szName[50];
SQLRETURN ret;
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if ((ret = SQLConnect(hdbc, (SQLCHAR *)"linxiaojie_orcl", SQL_NTS, (SQLCHAR *) "scott", SQL_NTS, (SQLCHAR *) "tiger", SQL_NTS)) == SQL_ERROR)
{
printf("SQLConnect Error !\n");
return(-1);
}
SQLAllocHandle (SQL_HANDLE_STMT, hdbc, &hstmt);
if ((ret = SQLExecDirect(hstmt, (SQLCHAR *) "select ename from emp", SQL_NTS)) == SQL_ERROR)
{
printf("SQLExecDirect Error !\n");
return(-2);
}
while (SQL_NO_DATA != SQLFetch(hstmt))
{
SQLGetData (hstmt, 1, SQL_C_CHAR, szName, 50, &len);
printf("%s\n", szName);
}
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return(0);
}
makefile:
all: makeall \
testodbc \
clean
DEFINES = -m32 -D _LINUX_
.SUFFIXES:.c.o
.c.o:
$(CC) $(DEFINES) $(INCL) -c $*.c
objs= testODBCConnectOracle.o
makeall: $(objs)
testodbc: $(null)
gcc -o testodbc $(objs) -lncurses -lrt -lpthread -lodbc
clean:
rm -rf *.o
测试结果:
[linxj@localhost Oracle]$ ./testodbc
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER