ODBC连接ORACLE

使用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

猜你喜欢

转载自blog.csdn.net/goodstudy168/article/details/8629110
今日推荐