问题的提出如何在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(::)