注意这里文件名中init之后的字符,它代表一个SID,而HS_FDS_CONNECT_INFO配置的就是ODBC数据源名称。
2.2.4. 添加HSXLS到Listener
进入Listener.ora所在目录如D:\Oracle\proddb\9.2.0\network\admin\PROD_huajhua,在SID_LIST里面添加:
(SID_DESC =
(SID_NAME = HSXLS)
(ORACLE_HOME = (PROGRAM = hsodbc)
)
比如我的数据库,添加完后内容如下:
#
# Net8 definition for Database listener
#
PROD =
(ADDRESS_LIST =
(ADDRESS= (PROTOCOL= IPC)(KEY= EXTPROCPROD))
(ADDRESS= (PROTOCOL= TCP)(Host= huajhua.leiko.com )(Port= 1521))
)
SID_LIST_PROD =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME= d:\oracle\proddb\9.2.0)
(SID_NAME = PROD)
)
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = d:\oracle\proddb\9.2.0)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = HSXLS)
(ORACLE_HOME = d:\oracle\proddb\9.2.0)
(PROGRAM = hsodbc)
)
)
……
重新Listener服务。至此,相当于建立了一个数据库HSXLS,有SID,有侦听。接下来可以像连接Oracle数据库一样用DB Link连接HSXLS。
2.2.5. 添加HSXLS到tnsnames.ora
可以在另一个Oracle数据库上配置,这里我还是在本机做,添加:
HSXLS=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=huajhua.leiko.com)(PORT=1521))
(CONNECT_DATA=(SID=HSXLS))
(HS=OK)
)
和普通TNSNAME不同点在于(HS=OK)。
2.2.6. 创建DB Link HSXLS_LINK
可以在另一个Oracle数据库上配置,这里我还是在本机做,创建脚本:
create database link HSXLS_LINK
connect to leiko identified by LEIKO_PASSWORD
using ‘HSXLS’;
注意这里用的是Excel文件所在的操作系统的用户名和密码,想象一下,Excel文件可能在网上邻居;如果是本机,则随便给都行。
2.2.7. 测试,请用标准SQL
1、 看看有哪些表
SELECT table_name FROM all_tables@hsxls_link
返回:
TABLE_NAME
1 DEPT$
2 EMP$
2、 查询下数据
SELECT dept.NAME dept_name, emp.NAME emp_name
FROM dept$@hsxls_link dept, emp$@hsxls_link emp
WHERE dept.dept_no = emp.dept_no
ORDER BY 1, 2
返回:
DEPT_NAME EMP_NAME
1 Test Name1
2 Test2 Name2
3、 DML操作
INSERT INTO dept$@hsxls_link VALUES (3, ‘Test3′);
UPDATE dept$@hsxls_link SET NAME = ‘Changed’ WHERE dept_no = 3;
如果DSN没有去掉只读标志,上面语句会报Ora-28500、Ora-02063错误。
2.2.8. 删除问题
Excel不支持删除,DELETE FROM dept$@hsxls_link WHERE dept_no = 3;报“该 ISAM 不支持在链接表中删除数据”。
因为Excel工作表中的行与真正的关系型数据库的行是有些不一样的,所以如果通过编程来访问Excel工作表的数据,那么检索,插入,更新应该是没有问题的,但要是删除的话,就会有一些限制。
删除 Excel 数据时,受到的限制要比从关系数据源中删除数据时更多。在关系数据库中,“行”除了表示一条“记录”外没有其他意义;但在 Excel 工作表中却不同。可以删除字段(单元格)中的值,但不能:
1、 一次删除一整条记录,否则将出现以下错误信息:
Deleting data in a linked table is not supported by this ISAM.
只能通过分别清空各个字段的内容来删除一条记录。
2、 删除包含 Excel 公式的单元格中的值,否则将出现以下错误信息:
Operation is not allowed in this context.
3、 虽然电子表格中已被删除的数据原来所在的行现在是空行,但无法将其删除,而且记录集将继续显示对应于这些空行的空记录。
针对这个问题,我们通常简单的做法就是清空字段的值,类似这样的写法:
UPDATE dept$@hsxls_link SET NAME = NULL, dept_no = NULL WHERE dept_no = 3;
当然,你要知道的是,这一行并没有真正删除掉,所以通常在select的时候要进行一定的筛选,例如:
SELECT * FROM dept$@hsxls_link WHERE dept_no IS NOT NULL;