oracle pro*c的一个简单例子[通俗易懂]

oracle pro*c的一个简单例子[通俗易懂]一、环境 参见unbuntu下Docker安装oracle和mysql,sqlserver。 创建例子用到的视图: SQL> create view mysc as select sc.sno,sc…

oracle pro*c的一个简单例子

一、环境

参见unbuntu下Docker安装oracle和mysql,sqlserver

创建例子用到的视图:

SQL> create view mysc as select sc.sno,sc.cno,sc.grade,student.sname,course.cname from sc,student,course where sc.sno=student.sno and sc.cno=course.cno;

代码100分

 

二、代码

stu_query.pc

代码100分
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlca.h>
#include <sqlcpr.h>

void sql_error(msg)
char *msg;
{
    char err_msg[512];
    size_t buf_len, msg_len;

    EXEC SQL WHENEVER SQLERROR CONTINUE;

    printf("/n%s/n", msg);

    /* Call sqlglm() to get the complete text of the
     * error message.
     */
    buf_len = sizeof (err_msg);
    sqlglm(err_msg, &buf_len, &msg_len);
    printf("%.*s/n", (int)msg_len, err_msg);

    EXEC SQL ROLLBACK RELEASE;
    exit(EXIT_FAILURE);
}

/*定义宿主变量*/
EXEC SQL BEGIN DECLARE SECTION;
    char *userid="mymotif";
    char *passwd="wxwpxh";
    char *sid="XE";
    char sno[8];
    char sname[10];
    char cname[13];
    float grade;
    short dept;
    short ind1;
    char qstring[80];
EXEC SQL END DECLARE SECTION;





int main()
  {
    EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--");
    EXEC SQL CONNECT :userid IDENTIFIED BY :passwd USING :sid;
    if (sqlca.sqlcode == 0)
      printf("连接成功

");
    else{
      printf("连接失败,exit(0)");
      getchar();
      exit(0);
    }
    EXEC SQL DECLARE c2 CURSOR FOR
      SELECT SNO,SNAME FROM STUDENT;

    printf( "%-13s%-8s
","学号","学生姓名");
    printf( "%-13s%-8s
","--------","------");
    EXEC SQL OPEN c2;
    do{
      EXEC SQL FETCH c2 INTO :sno,:sname; /* :rk.3:erk. */
      if (sqlca.sqlcode!= 0) break;
      printf( "%-13s%-8s
",sno, sname);
    }while(1);


    printf("查询学生成绩,请输入学生号:
");
    scanf("%s",sno);
    strcpy(qstring,"SELECT sname,cname,grade FROM MYSC WHERE SNO=:sno");

    EXEC SQL PREPARE q1 FROM :qstring;
    EXEC SQL DECLARE c1 CURSOR FOR q1;
    EXEC SQL OPEN c1 USING :sno;
    printf( "%-13s%-15s%-6s
", "学生姓名","课程名","成绩");
    printf( "%-13s%-15s%-6s
", "--------","----------", "-----");
    do{
     EXEC SQL FETCH c1 INTO :sname,:cname,:grade;
     if(sqlca.sqlcode != 0) break;
     printf( "%-13s%-15s%-6.2f
", sname, cname, grade);
    } while(1);
    return 0;

}

Makefile:

TARGET  = stu_query
SRCS    = stu_query.c
OBJS    = stu_query.o
COMMLIB = -lpthread -lclntsh
 
LINKER  = $(CC)
RM      = /bin/rm -f
PROC    = proc
 
PROCFLAGS = code=ANSI_C ireclen=2048 oreclen=2048 parse=none include=/usr/include
     include=/usr/include/linux
     include=/usr/local/include
 
CFLAGS  = -I$(ORACLE_HOME)/sdk/include
            -L$(ORACLE_HOME)/lib
 
 .SUFFIXES: .o .c .pc
 
 .c.o:
	$(CC) -c $(CFLAGS) $<
 
 .pc.c:
	@echo "PROC ."
	$(PROC) iname=$*.pc $(PROCFLAGS)
 
$(TARGET): $(SRCS) $(OBJS)
	$(CC) -o $@ $(OBJS) $(CFLAGS) $(COMMLIB)
 
clean :
	$(RM) *.lis $(SRCS) $(TARGET) $(OBJS) $(TARGET:%=%.c)

三、编译运行:

代码100分
$ make
PROC .
proc iname=stu_query.pc code=ANSI_C ireclen=2048 oreclen=2048 parse=none include=/usr/include include=/usr/include/linux include=/usr/local/include

Pro*C/C++: Release 11.2.0.4.0 - Production on 星期日 7月 19 13:47:49 2020

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

系统默认选项值取自于:  /opt/ora11g/instantclient_11_2/precomp/admin/pcscfg.cfg

cc -c -I/opt/ora11g/instantclient_11_2/sdk/include -L/opt/ora11g/instantclient_11_2/lib stu_query.c
cc -o stu_query stu_query.o -I/opt/ora11g/instantclient_11_2/sdk/include -L/opt/ora11g/instantclient_11_2/lib -lpthread -lclntsh
$ ./stu_query 
连接成功

学号       学生姓名
--------     ------  
9302203      马志元
9302303      马元   
9309203      王海滨
9402203      金力标
9402208      马娟   
查询学生成绩,请输入学生号:
9402203
学生姓名 课程名      成绩
--------     ----------     ----- 
金力标    数学分析   99.00 
金力标    数据结构   88.00 
金力标    分析力学   86.00 
金力标    高等分析   98.00 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7256.html

(0)
上一篇 2023-03-24
下一篇 2023-03-24

相关推荐

  • 快速计算指数函数的Python库

    快速计算指数函数的Python库Python中计算指数函数最简单的方法之一,就是利用NumPy库的exp函数。exp函数可以计算e的任意次幂,可以通过设置参数来计算任意底数的任意次幂。

    2024-02-04
    43
  • Python Dictionary:一种用于存储键值对的数据类型

    Python Dictionary:一种用于存储键值对的数据类型在Python编程语言中,字典(dictionary)是一种非常重要的数据类型。它允许我们存储键值对,并可以根据键快速地查找对应的值。

    2023-12-22
    63
  • python的math库用法(python语言math库)

    python的math库用法(python语言math库)不能。Python由荷兰数学和计算机科学研究学会的GuidovanRossum1990年代初设计,作为一门叫做ABC语言的替代品。math库中的函数包括math.lcm不能直接使用,需要首先使用保留字import引用该库才可进行使用。

    2023-12-02
    82
  • sql server是干嘛的_jdbc mysql

    sql server是干嘛的_jdbc mysqlcom.mysql.jdbc.Driver 是 mysql connector java 5中的, com.mysql.cj.jdbc.Driver 是 mysql connector java 6中

    2023-01-24
    114
  • Python爬虫入门指南

    Python爬虫入门指南随着互联网技术的快速发展,数据已经成为当今社会的核心资源之一。在数据收集和分析领域,爬虫作为一种强大的工具被广泛使用。特别是在人工智能这个领域上,爬虫的应用更加重要。Python作为一种流行的编程语言,提供了一些很好的库和工具,使得编写高效的爬虫更加容易。本文就是一篇关于Python爬虫入门指南,将介绍如何使用Python来构建一个基本的爬虫,可以帮助初学者更好地理解爬虫的原理和实现。

    2024-05-11
    38
  • mysql远程登录设置_思科ssh配置

    mysql远程登录设置_思科ssh配置配置远程登录MySQL 一个小白,记录每次遇到的坑。 环境是Docker+MySQL 步骤 在服务器端开启远程访问 首先进入mysql数据库,然后输入下面两个命令: grant all privile

    2023-03-05
    101
  • Python 字典(Dictionary):无序、可变、键值对存储数据

    Python 字典(Dictionary):无序、可变、键值对存储数据在 Python 中,字典是一种非常有用的数据结构。与列表和元组不同,字典是无序的,其中的元素以键值对的方式存储。这使得字典非常适合用来存储非数字数据,例如名称、地址、日期等信息。

    2024-01-17
    58
  • Python l in numbers:使用Python处理数字的工具

    Python l in numbers:使用Python处理数字的工具Python是一种通用编程语言,可以用于构建各种类型的应用程序。然而,在数字处理方面,Python表现出色,因为它由各种强大的数字处理工具组成。这篇文章将详细介绍使用Python处理数字的工具。

    2024-02-23
    67

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注