http://www.yesky.com/250/1850750_3.shtml
、程序內容
一般SQL嵌入式程序主要有說明、包含頭文件、子程序聲明、主程序和子程序等部分組成,在主程序中調用有關子程序。必備的子程序通常有連接到數據庫子程序、斷開數據庫子程序、錯誤處理子程序和完成某項具體事務(如查詢、插入、修改、刪除等)的工作子程序。
2、程序舉例
下面是一完整的可通過預編譯、編譯鏈接和運行的示例程序。
3、建表和插入數據記錄
上述示例程序如要正確運行,還需以Oracle庫的合法用戶登錄,并創建AUTHS表和插入一些數據記錄。建表文件、建表命令和插入數據記錄的示例命令如下所述。這里敘述的工作完成后,上節生成的可執行文件才能正確運行。
REM 以下為建表文件auths.SQL
、程序內容
一般SQL嵌入式程序主要有說明、包含頭文件、子程序聲明、主程序和子程序等部分組成,在主程序中調用有關子程序。必備的子程序通常有連接到數據庫子程序、斷開數據庫子程序、錯誤處理子程序和完成某項具體事務(如查詢、插入、修改、刪除等)的工作子程序。
2、程序舉例
下面是一完整的可通過預編譯、編譯鏈接和運行的示例程序。
/* exam01.pc 開發Oracle接口程序舉例 */ /* 說明:本程序介紹用PROC開發Oracle庫接口的編程特點。通過向AUTHS * 表輸入作家代碼,查詢作家姓名及工資。運行前應建表、插入數據并提交。*/ #include <stdio.h> #include <string.h> #include <stdlib.h> /* 包含SQL通訊區,它用于處理錯誤。*/ #include <sqlca.h> void connect(); /* 連接到Oracle Server */ void disconnect(); /* 斷開到Oracle Server的連接 */ void sql_error(char *); /* 處理錯誤句柄 */ void select(); /* 查詢子程序 */ extern sqlglm(char *,int *,int *); /* 主程序 */ void main() { /* 安裝錯誤處理句柄 */ EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle錯誤--\n"); /* 連接到數據庫 */ connect(); /* 執行查詢 */ select(); /* 斷開數據庫連接 */ disconnect(); } /* 子程序 */ /* 連接子程序 connect() */ void connect() { EXEC SQL BEGIN DECLARE SECTION; VARCHAR username[10], password[10], server[10]; EXEC SQL END DECLARE SECTION; /* 輸入用戶名、口令以及服務器名 */ printf("\n輸入用戶名:"); gets(username.arr); username.len=(unsigned short)strlen((char *)username.arr); printf("\n輸入口令:"); gets(password.arr); password.len=(unsigned short)strlen((char *)password.arr); printf("\n輸入服務器名:"); gets(server.arr); server.len=(unsigned short)strlen((char *)server.arr); /* 連接到Oracle服務器上 */ EXEC SQL CONNECT :username IDENTIFIED BY :password USING :server; printf("\n以用戶%s成功地連接到了服務器%s上!\n", username.arr, server.arr); } /* 斷開連接子程序 disconnect() */ void disconnect() { char temp; printf("\n是否在斷開連接前提交所有事務? (Y/N)"); scanf("%c", &temp); fflush(stdin); if(temp !='Y' && temp != 'y') { /* 回退事務,斷開連接。 */ EXEC SQL ROLLBACK WORK RELEASE; printf("\n回退事務,斷開連接,退出程序!\n\n"); } else { /* 提交事務,斷開連接。 */ EXEC SQL COMMIT WORK RELEASE; printf("\n提交事務,斷開連接,退出程序!\n\n"); exit(1); } } /* 查詢子程序 select() * 首先輸入作家代碼,然后查詢作家姓名和工資。*/ void select() { EXEC SQL BEGIN DECLARE SECTION; char author_code[8], name[10]; float salary; short salary_ind; EXEC SQL END DECLARE SECTION; printf("\n輸入作家代碼: "); gets(author_code); /* 查詢作家姓名和工資 */ EXEC SQL SELECT name, salary INTO :name, :salary:salary_ind FROM auths WHERE author_code = :author_code; /* 根據指示變量的值來確定該作家的工資是否為空。*/ if (salary_ind ==0) { printf("\n作家代碼\t作家姓名\t作家工資\n"); printf("--------\t--------\t--------\n"); printf("%8s\t%8s\t%8.2f\n", author_code, name, salary); } else { printf("作家%s的工資未錄入,為空值!\n", name); } } /* 錯誤處理子程序 sql_error() */ void sql_error(char *msg) { char err_msg[128]; size_t buf_len, msg_len; /* 出現SQL錯誤,繼續往下執行。 */ EXEC SQL WHENEVER SQLERROR CONTINUE; printf("\n%s\n", msg); buf_len=sizeof(err_msg); /* 調用函數sqlglm()獲得錯誤消息。 */ sqlglm(err_msg, &buf_len, &msg_len); printf("%.*s\n", msg_len, err_msg); /* 回退事務,斷開連接,退出程序。 */ EXEC SQL ROLLBACK RELEASE; exit(EXIT_FAILURE); } |
3、建表和插入數據記錄
上述示例程序如要正確運行,還需以Oracle庫的合法用戶登錄,并創建AUTHS表和插入一些數據記錄。建表文件、建表命令和插入數據記錄的示例命令如下所述。這里敘述的工作完成后,上節生成的可執行文件才能正確運行。
REM 以下為建表文件auths.SQL
DROP TABLE auths CASCADE CONSTRAINTS / CREATE TABLE auths( AUTHOR_CODE VARCHAR2(8) NOT NULL, NAME VARCHAR2(10), BIRTHDATE DATE, ENTRY_DATE_TIME DATE, SALARY NUMBER(7,2), remark VARCHAR2(255)) / REM 下一行為在PL/SQL環境中運行建表文件的命令 REM @ E: \ PROCW \ Exam01 \ auths.sql REM 下一行為在PL/SQL環境中向auths表插入數據的命令,插入后應提交(COMMIT)! REM INSERT INTO auths(author_code,name,salary) VALUES('A00001','王達琳',1200); |