数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle与Access表之间的导入和导出实现


发布日期:2022年08月16日
 
Oracle与Access表之间的导入和导出实现

问题的提出如何在FORM的程序中实现Oracle与Access表之间的导入和导出

问题的解答

准备工作

安装OCA运行Developer的安装盘选择自定义安装选择Oracle Open Client Adapter for ODBC安装

在数据源(ODBC)中添加DSN控制面板>管理工具>数据源(ODBC)选择用户DSN添加要进行操作的Access的文件高级选项里填上登录名称密码(很重要在程序中会用到)

下面以实际例子来说明

假设在Oracle中和Access中都有一个student表表中字段相同(name char() age number())在准备工作中的数据源名为test登录名称密码都为user

下面为从Oracle导出到Access的procedure

以下是引用片段

PROCEDUREoracle_to_accessIS

connection_idEXEC_SQLConnType;

action_cursorEXEC_SQLCursType;

ignorePLS_INTEGER;

t_namestudentname%type;

t_agestudentage%type;

cursortemp_cursorisselect*fromstudent;

BEGIN

connection_id:=EXEC_SQLOPEN_CONNECTION(user/user@odbc:test);

action_cursor:=EXEC_SQLOPEN_CURSOR(connection_id);

EXEC_SQLPARSE(connection_idaction_cursordelete*fromstudent);

ignore:=EXEC_SQLEXECUTE(connection_idaction_cursor);

EXEC_SQLCLOSE_CURSOR(connection_idaction_cursor);

opentemp_cursor;

export_count:=;

action_cursor:=EXEC_SQLOPEN_CURSOR(connection_id);

EXEC_SQLPARSE(connection_idaction_cursorINSERTINTOstudent(nameage)values(::));

loop

fetchtemp_cursorintot_namet_age;

exitwhentemp_cursor%notfound;

EXEC_SQLBIND_VARIABLE(connection_idaction_cursor:t_name);

EXEC_SQLBIND_VARIABLE(connection_idaction_cursor:t_age);

ignore:=EXEC_SQLEXECUTE(connection_idaction_cursor);

endloop;

closetemp_cursor;

EXEC_SQLPARSE(connection_idaction_cursorcommit);

ignore:=EXEC_SQLEXECUTE(connection_idaction_cursor);

EXEC_SQLCLOSE_CURSOR(connection_idaction_cursor);

EXEC_SQLCLOSE_CONNECTION(connection_id);

EXCEPTION

WHENEXEC_SQLPACKAGE_ERRORTHEN

IFEXEC_SQLLAST_ERROR_CODE(connection_id)!=THEN

message(数据导出至ACCESS失败:||TO_CHAR(EXEC_SQLLAST_ERROR_CODE(connection_id))||:||EXEC_SQLLAST_ERROR_MESG(connection_id));

ENDIF;

IFEXEC_SQLIS_CONNECTED(connection_id)THEN

IFEXEC_SQLIS_OPEN(connection_idaction_cursor)THEN

EXEC_SQLCLOSE_CURSOR(connection_idaction_cursor);

ENDIF;

EXEC_SQLCLOSE_CONNECTION(connection_id);

ENDIF;

END;

下面为从Access导出到Oracles的procedure

PROCEDUREAccess_to_oracleIS

connection_idEXEC_SQLConnType;

action_cursorEXEC_SQLCursType;

ignorePLS_INTEGER;

t_namestudentname%type;

t_agestudentage%type;

BEGIN

connection_id:=EXEC_SQLOPEN_CONNECTION(user/user@odbc:test);

action_cursor:=EXEC_SQLOPEN_CURSOR(connection_id);

deletefromstudent;

EXEC_SQLPARSE(connection_idaction_cursorselectnameagefromstudent);

ignore:=EXEC_SQLEXECUTE(connection_idaction_cursor);

exec_sqldefine_column(connection_idaction_cursort_name);

exec_sqldefine_column(connection_idaction_cursort_age);

ignore:=EXEC_SQLEXECUTE(connection_idaction_cursor);

while(exec_sqlfetch_rows(connection_idaction_cursor)>)

loop

lumn_value(connection_idaction_cursort_name);

lumn_value(connection_idaction_cursort_age);

insertintotest(nameage)values(t_namet_age);

endloop;

commit;

EXEC_SQLCLOSE_CURSOR(connection_idaction_cursor);

EXEC_SQLCLOSE_CONNECTION(connection_id);

EXCEPTION

WHENEXEC_SQLPACKAGE_ERRORTHEN

IFEXEC_SQLLAST_ERROR_CODE(connection_id)!=THEN

message(数据导入至ORACLE失败:||TO_CHAR(EXEC_SQLLAST_ERROR_CODE(connection_id))||:||EXEC_SQLLAST_ERROR_MESG(connection_id));

ENDIF;

IFEXEC_SQLIS_CONNECTED(connection_id)THEN

IFEXEC_SQLIS_OPEN(connection_idaction_cursor)THEN

EXEC_SQLCLOSE_CURSOR(connection_idaction_cursor);

ENDIF;

EXEC_SQLCLOSE_CONNECTION(connection_id);

ENDIF;

END;

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

上一篇:FuseTalk安装学CFMX数据库安装技巧

下一篇:postfix出现错误“fatal: open database /etc/aliases.db”