This Is A FineDay

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            93 隨筆 :: 0 文章 :: 69 評論 :: 0 Trackbacks
          http://www.yesky.com/250/1850750_3.shtml
          程序內容

            一般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);
          posted on 2008-07-02 22:44 Peter Pan 閱讀(186) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 建湖县| 芜湖市| 泾阳县| 黑水县| 柞水县| 当雄县| 康乐县| 尼勒克县| 莆田市| 寿光市| 舞钢市| 栾川县| 清徐县| 罗定市| 泰兴市| 杂多县| 城口县| 云和县| 英吉沙县| 涟水县| 蒲城县| 扬中市| 东平县| 阿拉尔市| 二连浩特市| 靖州| 鄂州市| 菏泽市| 玛纳斯县| 怀远县| 漳平市| 靖州| 吉木萨尔县| 高要市| 彭阳县| 贡嘎县| 贡山| 普格县| 晋江市| 博湖县| 美姑县|