文章詳情頁
Oracle與Access表之間的導入和導出
瀏覽:99日期:2023-11-22 14:14:36
本文主要回答了如何在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: PROCEDUREoracle_to_accessISconnection_idEXEC_SQL.ConnType;action_cursorEXEC_SQL.CursType;ignorePLS_INTEGER;t_namestudent.name%type;t_agestudent.age%type;cursortemp_cursorisselect*fromstudent;BEGINconnection_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*fromstudent');ignore:=EXEC_SQL.EXECUTE(connection_id,action_cursor);EXEC_SQL.CLOSE_CURSOR(connection_id,action_cursor);opentemp_cursor;eXPort_count:=0;action_cursor:=EXEC_SQL.OPEN_CURSOR(connection_id);EXEC_SQL.PARSE(connection_id,action_cursor,'INSERTINTOstudent(name,age)values(:1,:2)');loopfetchtemp_cursorintot_name,t_age;exitwhentemp_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);endloop;closetemp_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);EXCEPTIONWHENEXEC_SQL.PACKAGE_ERRORTHENIFEXEC_SQL.LAST_ERROR_CODE(connection_id)!=0THENmessage('數據導出至ACCESS失敗:'TO_CHAR(EXEC_SQL.LAST_ERROR_CODE(connection_id))':'EXEC_SQL.LAST_ERROR_MESG(connection_id));ENDIF;IFEXEC_SQL.IS_CONNECTED(connection_id)THENIFEXEC_SQL.IS_OPEN(connection_id,action_cursor)THENEXEC_SQL.CLOSE_CURSOR(connection_id,action_cursor);ENDIF;EXEC_SQL.CLOSE_CONNECTION(connection_id);ENDIF;END;下面為從Access導出到Oracles的procedure:PROCEDUREAccess_to_oracleISconnection_idEXEC_SQL.ConnType;action_cursorEXEC_SQL.CursType;ignorePLS_INTEGER;t_namestudent.name%type;t_agestudent.age%type;BEGINconnection_id:=EXEC_SQL.OPEN_CONNECTION('user/user@odbc:test');action_cursor:=EXEC_SQL.OPEN_CURSOR(connection_id);deletefromstudent;EXEC_SQL.PARSE(connection_id,action_cursor,'selectname,agefromstudent');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)loopexec_sql.column_value(connection_id,action_cursor,1,t_name);exec_sql.column_value(connection_id,action_cursor,2,t_age);insertintotest(name,age)values(t_name,t_age);endloop;commit;EXEC_SQL.CLOSE_CURSOR(connection_id,action_cursor);EXEC_SQL.CLOSE_CONNECTION(connection_id);EXCEPTIONWHENEXEC_SQL.PACKAGE_ERRORTHENIFEXEC_SQL.LAST_ERROR_CODE(connection_id)!=0THENmessage('數據導入至ORACLE失敗:'TO_CHAR(EXEC_SQL.LAST_ERROR_CODE(connection_id))':'EXEC_SQL.LAST_ERROR_MESG(connection_id));ENDIF;IFEXEC_SQL.IS_CONNECTED(connection_id)THENIFEXEC_SQL.IS_OPEN(connection_id,action_cursor)THENEXEC_SQL.CLOSE_CURSOR(connection_id,action_cursor);ENDIF;EXEC_SQL.CLOSE_CONNECTION(connection_id);ENDIF;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)。
排行榜
