Proc编程上机报告

Proc编程实验
一、 实验内容
1)在数据库中创建三个表:学生S、课程C、s成绩SC。
2)使用pro*C编写程序,完成对数据库的操作,并按照相应格式输出,格式如下:
Proc编程上机报告

3)使用Pro*C编写程序, 完成对数据库的操作, 并按相应格式输出,格式范例如下:
Proc编程上机报告

二、 实验过程
1) 创建的S表:
Proc编程上机报告
图1:S表数据信息
创建的C表:
Proc编程上机报告
图2:创建的C表信息
创建的SC表:
Proc编程上机报告
Proc编程上机报告
Proc编程上机报告
图3:创建SC表信息
2) 使用proc编写程序:
首先使用rdbms中能够预编译该.pc文件的可执行程序。从该可执行程序预编译该 .pc文件。
也可直接在cmd中输入proc 文件名进行编译
Proc编程上机报告
图4:proc编写.pc文件
3)运行编译后.c文件
直接使用vs经行编译会出现报错。需要调下vs的配置参数,如下:
右键点击项目->属性->vc++目录->包含目录中添加头文件目录: oracle\product\11.1.0\client_1\precomp\public
库目录中添加.lib目录:
oracle\product\11.1.0\client_1\precomp\LIB
oracle\product\11.1.0\client_1\RDBMS\XA
oracle\product\11.1.0\client_1\oci\lib\msvc
oracle\product\11.1.0\client_1\precomp\LIB\msvc
右键点击项目->属性->配置属性->链接器->输入->附加依赖项添加.lib文件:
orasql11.lib;oraxa11.lib;oci.lib;orasqx11.lib
修该参数后,运行依然会报错,显示代码中的类和C中的类冲突,我们则需要提前预编译,预编译代码如下:
下面展示一些 内联代码片

#ifdef __cplusplus
extern "C"
{
#endif
    int yyparse(void);
    void sqliem(unsigned char*, signed int*);
    void sqlcxt(void**, unsigned int*,
        struct sqlexd*, const struct sqlcxp*);
    //。。。各种需要的函数声明
#ifdef __cplusplus 
}
#endif

4)修改.pc文件

void sql_error();//报错函数
void FindDept();//查找系学生信息
void FindName();//查找学生信息
int main()
{  
   exec sql include sqlca;
   exec sql begin declare section;
      char user_name[20];
      char  user_pwd[20]; 
      char db_name[20]; 
       char  ip[20]; 
      char port[20]; 
      char url[100];
      int i;
      char s_no[6];
      char s_name[10];
      char s_sex[4];
      int s_age; 
      int var_age; 
      char dept[5];
      int choice;
   exec sql end declare section;
   exec sql whenever SQLERROR do sql_error();
      printf("\n\n\b 欢迎登录学生年龄查询功能\n\n");
      printf("\b\b IP地址:"); gets_s(ip);
      printf("\b\b Port号:");gets_s(port);  
      printf("\b\b 数据库服务器名称:");gets_s(db_name); 
      printf("\b\b 用户名:"); gets_s(user_name);
      printf("\b\b 密码:");gets_s(user_pwd);  
    strcpy_s(url,ip);
    strcat_s(url,":");
    strcat_s(url,port);
    strcat_s(url,"/");
    strcat_s(url,db_name);  
   exec sql connect :user_name
              identified by :user_pwd using :url;   
   printf("\n\n 用户:%s 密码:%s,哈哈,登陆成功.\n",user_name,user_pwd);  
   system("pause");
    while(1)
    {     
        system("cls");
        cout << "请输入选项:" << endl;
        cout << "1.查询某系的学生" << endl;
        cout << "2.查询某学生的课程成绩" << endl;
        cout << "3.退出系统" << endl;
        cin >> choice;
        switch (choice)
        {
            case 1:
                FindDept();
                break;
            case 2:
                FindName();
                break;
            case 3:
                break;
       }
      if(choice == 3) break;
    }
    system("pause")
    exec sql commit release;             
    return 0;
}
 void FindDept()
{
     exec sql include sqlca;
     exec sql begin declare section;
     char s_no[6];
     char s_name[10];
     char s_sex[4];
     int s_age;
     char dept[5];
     exec sql end declare section;
    int i = 0;
    system("cls");
    cout << "请输入查找系别名称:";
    cin >> dept;
    exec sql declare sx1 cursor for
        select sno, sname, sex, age from s where s.dept = :dept;
    exec sql open sx1;
    system("cls");
    cout << "\n\t\t" << dept << "系的学生信息为" << endl;
    cout << "\n\t---------------------------------------------";
    cout << "\n\t序号\t学号\t姓名\t\t性别\t年龄" << endl;
    cout << "\n\t---------------------------------------------";
    while (1)
    {
        exec sql fetch sx1 into : s_no, : s_name, : s_sex, : s_age;
        if (sqlca.sqlcode != 0)  break;
        i++;
        printf("\n\t %d\t%s\t%s\t%s\t%d", i, s_no, s_name, s_sex, s_age);
    }
    exec sql close sx1;
}
void FindName()
{
    int i = 0;
    int sum = 0;
    exec sql include sqlca;
    exec sql begin declare section;
    char s_no[6];
    char s_name[10];
    char s_sex[4];
    char c_name[10];
    int grade;
    int s_age;
    char name[10];
    exec sql end declare section;
    system("cls");
    cout << "请输入查找学生的姓名:";
    cin >> name;
    exec sql declare sx2 cursor for
        select c.cname, sc.grade from s, c, sc where c.cno = sc.cno and s.sno = sc.sno and s.sname = :name;
    exec sql open sx2;
    system("cls");
    cout << "\n\t\t" << name << "学生信息为" << endl;
    cout << "\n\t---------------------------------------------";
    cout << "\n\t序号\t课程号\t成绩" << endl;
    cout << "\n\t---------------------------------------------";
    while (1)
    {
        exec sql fetch sx2 into : c_name, : grade;
        if (sqlca.sqlcode != 0)  break;
        i++;
        sum += grade;
        printf("\n\t %d\t%s\t%d", i, c_name, grade);
    }
    if (i != 0)
    {
        cout << "平均成绩:" << sum / i << endl;
    }
    exec sql close sx2;
}
void sql_error()
{
   printf("SQL语句错误:错误代号:%d 错误描述:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
    system("pause");
    exit(0);
}
#endif

三、 实验结果
1) 登录用户:
Proc编程上机报告
图5:登录用户
2) 查询系学生信息:
Proc编程上机报告
3) 查询某个学生的信息:
Proc编程上机报告
图 7:文章学生的信息
四、 实验总结
通过上机编程,了解如何使用proc预编译.pc文件,通过网上查询学习,了解如何使用vs编译预编译后的c程序,了解处理函数冲突的处理方法。

----本问章用于记录博主数据库学习,转载请注明来处!

上一篇:Docker文件上传与环境变量配置、基本信息查看


下一篇:js 正则方法 exec和match 以及正则的匹配顺序