[轉]Oracle_ProC編程

來源:互聯網
上載者:User

標籤:

1.引言 由於PL/SQL不能用來開發面向普通使用者的應用程式,必須藉助其他語言或開發工具。 在Linux作業系統下應該用什麼語言或開發工具來進行Oracle資料庫應用的開發呢?本文將介紹2種方案:Pro*C、JDBC。而另一種SQLJ方法, 限於篇幅省略。 2. 環境設定 2.1 軟體環境 本文的實驗環境是在Red Hat Linux 9.0作業系統下,因為Oracle 9i要求至少512MB記憶體,所以我們選擇Oracle 9iR2作為資料庫環境。說明一 點:Oracle 9i的典型安裝不包括Pro*C,需要在定製安裝方式下將開發工具中的Pro*C選中。後面的JDBC操作我沒有測試只是從別人那裡粘貼過 來的,因為本人對Java 不太熟悉(有興趣的朋友可以試一下). 2.2Oracle使用者的環境變數設定 為了方便,本文的操作都是以Oracle使用者登入的。在Oracle使用者的.bash_profile檔案中必須包含以下行: 環境變數用上一章的就可以了。 tnsnames.ora 加入下面語句: ORA9I.LOCALDOMAIN= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS =(PROTOCOL = TCP)(HOST = your ip address)(PORT=1521)) ) (CONNECT_DATA = (SERVICE_NAME = ora9i.database) ) ) 2.3 建立實驗使用者和資料表 建立一個新的Oracle使用者test,然後在新使用者下建一個記錄學產生績的student表,該表很簡單,只有三個欄位:id、name、score。 $sqlplus "sys/as sysdba" SQL>create user test identified by test default tablspace users; SQL>grant connect to test; SQL>grant resource to test; SQL>connect test/test; SQL>create table student(id number,name varchar2(20),score number); SQL>insert into test values(1,’zhang’,95); SQL>insert into test values(2,’xing’,97); 向student表中添加一些實驗資料。 以上操作執行完後: 最好用命令 sqlplus test/[email protected]去測試一下tns服務設定的是否正確,如果能正常登陸就說明tns設定正確,前提是lsnrctl start 命令已 經執行。 3.Pro*C編程 Oracle的Pro*C先行編譯器是一個可以讓你在C語言來源程式中嵌入SQL語句的編程工具。Pro*C先行編譯器在先行編譯過程中,將嵌入的SQL語句轉換成對 標準Oracle運行庫的調用,從而產生先行編譯過的原始碼,然後再進行通常的編譯、串連後就可以運行了。Oracle Pro*c先行編譯器使我們可以在 應用程式中使用強大靈活的SQL,通過這個介面,我們就可以用我們的C語言程式直接存取Oracle資料庫。 用Pro*c編程分為三步: (1) 首先建立尾碼名為.pc的內嵌SQL語句的C來源程式檔案; $vi stu.pc (2) 對來源程式stu.pc進行先行編譯,產生單純的C來源程式stu.c (本人傾向於做個make檔案,以後如果測試或建工程方便一點) $proc PARSE=NONE stu.pc (3) 編譯該C程式,並加入Oracle的用戶端動態連結程式庫 ,產生可執行檔stu $gcc –o stu stu.c $ORACLE_HOME/lib/libclntsh.so 以下是stu.pc的來源程式,該程式的功能是根據使用者輸入的ID號,查詢student表中學生的姓名和成績。 #include EXEC SQL INCLUDE SQLCA; void main() { /*聲明宿主變數*/ EXEC SQL BEGIN DECLARE SECTION; VARCHAR usr[20],pass[20],serv[20]; char name[8]; int id,score; EXEC SQL END DECLARE SECTION; /*設定串連資料庫的使用者名稱、密碼和資料庫服務名*/ strcpy(usr.arr,"test"); usr.len=(unsigned short)strlen((char *)usr.arr); strcpy(pass.arr,"test"); pass.len=(unsigned short)strlen((char *)pass.arr); strcpy(serv.arr,"ora9i"); serv.len=(unsigned short)strlen((char *)serv.arr); /*以test使用者串連資料庫*/ EXEC SQL CONNECT :usr IDENTIFIED BY :pass USING :serv; /*如果正式編程,最好加入對sqlca.sqlcode的判斷 if(sqlca.sqlcode) { printf("ORA-ERROR: sqlca.sqlcode=%d\n",sqlca,sqlcode); exit(0); }*/ printf("Connect!\n"); /*使用者輸入欲查詢的ID號*/ printf("請輸入學生代碼:"); scanf("%d",&id); /*執行動態SQL查詢語句*/ EXEC SQL SELECT id,name,score into :id, :name,:score from student where id=:id; printf("Name=%s Score=%d\n",name,score); /*提交事務並斷開與資料庫的串連*/ EXEC SQL COMMIT WORK RELEASE; printf("Disconnect!\n"); } 在Pro*C中遍曆資料表中每一條記錄的方法是通過聲明遊標來實現的,下面的常式stu2.pc便是一個使用遊標的例子,其功能是顯示student表中 的每一條記錄。 #include EXEC SQL INCLUDE SQLCA; void main() { /*聲明宿主變數*/ EXEC SQL BEGIN DECLARE SECTION; VARCHAR usr[20],pass[20],serv[20]; char name[8]; int id,score; EXEC SQL END DECLARE SECTION; /*設定串連資料庫的使用者名稱、密碼和資料庫服務名*/ strcpy(usr.arr,"test"); usr.len=(unsigned short)strlen((char *)usr.arr); strcpy(pass.arr,"test"); pass.len=(unsigned short)strlen((char *)pass.arr); strcpy(serv.arr,"ora9i"); serv.len=(unsigned short)strlen((char *)serv.arr); /*以test使用者串連資料庫*/ EXEC SQL CONNECT :usr IDENTIFIED BY :pass USING :serv; printf("Connect!\n"); /*聲明遊標*/ EXEC SQL DECLARE stu_cursor CURSOR FOR SELECT id,name,score from student; printf("DECLARE CURSOR OK!\n"); /*開啟遊標*/ EXEC SQL OPEN stu_cursor; printf("OPEN CURSOR OK!\n"); /*錯誤處理*/ EXEC SQL WHENEVER NOT FOUND DO break; /*逐一查看遊標資料*/ while(1) { EXEC SQL FETCH stu_cursor INTO :id,:name,:score; printf("Id=%d Name=%s Score=%d\n",id,name,score); } /*關閉遊標*/ EXEC SQL CLOSE stu_cursor; /*提交事務並斷開與資料庫的串連*/ EXEC SQL COMMIT WORK RELEASE; printf("Disconnect!\n"); } 4. JDBC編程 在Linux下用JDBC訪問Oracle資料庫主要有以下幾個技術要點: (1) 註冊 Oracle的JDBC驅動。有兩種方式,一種是調用class.forName方法: Class.forName("oracle.jdbc.driver.OracleDriver"); 另一種是調用DriverManager類的registerDriver方法: DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); (2) 擷取Oracle資料庫的串連。也有兩種方式。一是調用OCI驅動程式,OCI驅動程式利用Java本地化介面(JNI),通過Oracle用戶端軟體與數 據庫進行通訊。 Connection conn=DriverManager. getConnection("jdbc:oracle:oci8:@","test","test"); 另一種方式是調用Thin驅動程式。Thin驅動程式是純Java驅動程式,它直接與資料庫進行通訊。 conn=DriverManager.getConnection ("jdbc:oracle:thin:@your ip address:1521:ora9i","test","test"); 為了獲得最高的效能,Oracle公司建議在用戶端軟體的開發中使用OCI驅動程式。 (3) 建立Statament和結果集對象,執行SQL語句,結果返回到結果集。 Statement pstmt=conn.createStatement(); ResultSet rset= pstmt.executeQuery(query) (4) 處理結果集,顯示資料。 以下是遍曆student資料表的Java來源程式Stu.java,來源程式中包含了兩種註冊Oracle驅動的方式,以及OCI和Thin兩種串連資料庫的方法(因程 序中不可能同時使用兩種方法,所以另一種方法被注釋)。 /* 匯入Java類 */ import java.sql.*; /* 主類 */ public class Stu { public static void main(String argv[]) throws SQLException { /* 聲明並初始設定變數 */ String query = new String("SELECT id,name,score FROM student"); String name; int id,score; Connection conn=null; try{ /*第一種註冊JDBC的Oracle驅動的方法*/ //Class.forName("oracle.jdbc.driver.OracleDriver"); /*第二種註冊JDBC的Oracle驅動的方法*/ DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver()); }catch(Exception e){ System.out.println("Could not load drive:"+e); System.exit(-1); } /*利用Thin驅動程式擷取Oracle串連*/ //conn=DriverManager.getConnection ("jdbc:oracle:thin:@your ip address:1521:ora9i","test","test"); //System.out.println("Connected with THIN CLIENT!"); /*利用OCI驅動程式擷取Oracle串連*/ conn=DriverManager.getConnection ("jdbc:oracle:oci9:@","test","test"); System.out.println("Connected with OCI8!\n"); /* 使用try ... catch抓取並處理例外 */ try { Statement pstmt=conn.createStatement(); /* 執行SQL語句 */ ResultSet rset= pstmt.executeQuery(query); /* 迴圈處理JDBC結果集的資料 */ while(rset.next()) { id=rset.getInt(1); name = rset.getString(2); score=rset.getInt(3); System.out.println("ID=" + id); System.out.println("NAME=" + name); System.out.println("SCORE=" + score); System.out.println("---------------"); } /* 關閉JDBC結果集 */ rset.close(); /* 關閉動態SQL語句 */ pstmt.close(); } catch(SQLException e) { System.out.println("出現SQL例外:" + e.getMessage()); } conn.close(); } } 編譯、執行上述來源程式,可顯示出student表中所有記錄。 $javac Stu.java $java Stu 原文地址:http://blog.csdn.net/dragon101788/article/details/7055648

[轉]Oracle_ProC編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.