ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Proc编程上机报告

2021-06-06 14:32:20  阅读:146  来源: 互联网

标签:printf name 上机 exec int 编程 char sql Proc


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

3)使用Pro*C编写程序, 完成对数据库的操作, 并按相应格式输出,格式范例如下:
在这里插入图片描述

二、 实验过程
1) 创建的S表:
在这里插入图片描述
图1:S表数据信息
创建的C表:
在这里插入图片描述
图2:创建的C表信息
创建的SC表:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
图3:创建SC表信息
2) 使用proc编写程序:
首先使用rdbms中能够预编译该.pc文件的可执行程序。从该可执行程序预编译该 .pc文件。
也可直接在cmd中输入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) 登录用户:
在这里插入图片描述
图5:登录用户
2) 查询系学生信息:
在这里插入图片描述
3) 查询某个学生的信息:
在这里插入图片描述
图 7:文章学生的信息
四、 实验总结
通过上机编程,了解如何使用proc预编译.pc文件,通过网上查询学习,了解如何使用vs编译预编译后的c程序,了解处理函数冲突的处理方法。

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

标签:printf,name,上机,exec,int,编程,char,sql,Proc
来源: https://blog.csdn.net/m0_51275144/article/details/117626079

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有