设为首页 收藏本站
查看: 1089|回复: 0

[经验分享] Oracle与Access表之间的导入和导出实现

[复制链接]

尚未签到

发表于 2016-8-7 07:30:35 | 显示全部楼层 |阅读模式
问题的提出:如何在FORM的程序中实现Oracle与Access表之间的导入和导出。   问题的解答:
  准备工作:
  1.安装OCA。运行Developer的安装盘,选择自定义安装,选择Oracle Open Client Adapter for ODBC安装。
  2.在数据源(ODBC)中添加DSN。控制面板->管理工具->数据源(ODBC),选择“用户DSN”,添加要进行操作的Access的文件。在“高级”选项里,填上“登录名称”和“密码”(很重要,在程序中会用到)。
  下面以实际例子来说明:
  假设在Oracle中和Access中都有一个student表,表中字段相同(name char(10) ,age number(2)),在准备工作2中的“数据源名”为test,“登录名称”和“密码”都为user。
  下面为从Oracle导出到Access的procedure:
  
DSC0000.gif PROCEDURE oracle_to_access IS
  connection_id EXEC_SQL.ConnType;
  action_cursor EXEC_SQL.CursType;
  ignore PLS_INTEGER;
  t_name student.name
%type;
  t_age student.age
%type;
  
cursor temp_cursor is select * from student;
  
BEGIN
  connection_id:
= EXEC_SQL.OPEN_CONNECTION('user/user@odbc:test');
  action_cursor :
= EXEC_SQL.OPEN_CURSOR(connection_id);
  EXEC_SQL.PARSE(connection_id, action_cursor,
'delete * from student');
  ignore :
= EXEC_SQL.EXECUTE(connection_id, action_cursor);
  EXEC_SQL.CLOSE_CURSOR(connection_id,action_cursor);
  
open temp_cursor;
  export_count :
= 0;
  action_cursor :
= EXEC_SQL.OPEN_CURSOR(connection_id);
  EXEC_SQL.PARSE(connection_id, action_cursor,
'INSERT INTO student(name,age) values(:1,:2)');
  loop
  
fetch temp_cursor into t_name,t_age;
  
exit when temp_cursor%notfound;
  EXEC_SQL.BIND_VARIABLE(connection_id,action_cursor, 
':1', t_name);
  EXEC_SQL.BIND_VARIABLE(connection_id,action_cursor, 
':2', t_age);
  ignore :
= EXEC_SQL.EXECUTE(connection_id, action_cursor);
  
end loop;
  
close temp_cursor;
  EXEC_SQL.PARSE(connection_id, action_cursor,
'commit');
  ignore :
= EXEC_SQL.EXECUTE(connection_id,action_cursor);
  EXEC_SQL.CLOSE_CURSOR(connection_id,action_cursor);
  EXEC_SQL.CLOSE_CONNECTION(connection_id);
  EXCEPTION
  
WHEN EXEC_SQL.PACKAGE_ERROR THEN
  
IF EXEC_SQL.LAST_ERROR_CODE(connection_id) != 0 THEN
  message(
'数据导出至ACCESS失败: ' || TO_CHAR(EXEC_SQL.LAST_ERROR_CODE (connection_id)) || '' || EXEC_SQL.LAST_ERROR_MESG(connection_id));
  
END IF;
  
IF EXEC_SQL.IS_CONNECTED(connection_id) THEN
  
IF EXEC_SQL.IS_OPEN(connection_id,action_cursor) THEN
  EXEC_SQL.CLOSE_CURSOR(connection_id,action_cursor);
  
END IF;
  EXEC_SQL.CLOSE_CONNECTION(connection_id);
  
END IF;
  
END;
  下面为从Access导出到Oracles的procedure:
  
PROCEDURE Access_to_oracle IS
  connection_id EXEC_SQL.ConnType;
  action_cursor EXEC_SQL.CursType;
  ignore PLS_INTEGER;
  t_name student.name
%type;
  t_age student.age
%type;
  
BEGIN
  connection_id :
= EXEC_SQL.OPEN_CONNECTION('user/user@odbc:test');
  action_cursor :
= EXEC_SQL.OPEN_CURSOR(connection_id);
  
delete from student;
  EXEC_SQL.PARSE(connection_id, action_cursor,
'select name,age from student');
  ignore :
= EXEC_SQL.EXECUTE(connection_id, action_cursor);
  exec_sql.define_column(connection_id,action_cursor,
1,t_name,10);
  exec_sql.define_column(connection_id,action_cursor,
2,t_age);
  ignore :
= EXEC_SQL.EXECUTE(connection_id, action_cursor);
  
while(exec_sql.fetch_rows(connection_id,action_cursor)>0)
  loop
  exec_sql.column_value(connection_id,action_cursor,
1,t_name);
  exec_sql.column_value(connection_id,action_cursor,
2,t_age);
  
insert into test(name,age) values(t_name,t_age);
  
end loop;
  
commit;
  EXEC_SQL.CLOSE_CURSOR(connection_id,action_cursor);
  EXEC_SQL.CLOSE_CONNECTION(connection_id);
  EXCEPTION
  
WHEN EXEC_SQL.PACKAGE_ERROR THEN
  
IF EXEC_SQL.LAST_ERROR_CODE(connection_id) != 0 THEN
  message(
'数据导入至ORACLE失败: ' || TO_CHAR(EXEC_SQL.LAST_ERROR_CODE (connection_id)) || '' || EXEC_SQL.LAST_ERROR_MESG(connection_id));
  
END IF;
  
IF EXEC_SQL.IS_CONNECTED(connection_id) THEN
  
IF EXEC_SQL.IS_OPEN(connection_id,action_cursor) THEN
  EXEC_SQL.CLOSE_CURSOR(connection_id,action_cursor);
  
END IF;
  EXEC_SQL.CLOSE_CONNECTION(connection_id);
  
END IF;
  
END;


  
 注意:EXEC_SQL.BIND_VARIABLE中绑定的变量只能是以下三种类型:NUMBER,DATE,VARCHAR2。对于Access中的 “是/否”的布尔型变量,可以用NUMBER类型的1和0来表示。如果Access中的表名或者字段名中有空格,在写SQL语句的时候可以用双引号把表名 或者字段名包括起来,如:本例中如果Access中表名为student detail,字段名分别为student name和student age,那插入数据的SQL语句为:insert into “student detail”(“student name”,”student age”) values(:1,:2)。

本文引用地址:http://www.tenwe.com/tech/database/oracle/200701/content_285.shtml

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-254229-1-1.html 上篇帖子: JBoss下采用thin driver连接 Oracle RAC方法 下篇帖子: hibernate取得oracle中clob对象的值
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表