c语言oracle嵌入式,数据库编程4 Oracle Pro*C/C++开发

1,上次难点复习

1 求所有部门的平均奖金

2 求各部门的平均薪水

3 求各部门每个工种的平均薪水

4 求各部门每个工种大于2000的平均薪水

5 求10号部门的平均工资(2种写法)

6 创建一个学生表

7 并向表中插入一条数据

8 列出不是管理层的员工:

9 工资最高前10名的员工信息(rownum是一个属性值)

10 找到各部门大于本部门平均薪水的员工:

11 创建索引

Linux 环境 Oracle  Pro*C Oracle 编程:

官方文档

Linux 下Oracle数据库的环境部署

配置proc编译器

配置vim 为pc文件高亮

Proc*C/C++编译配置

Oracle数据类型

proc小试身手

C语言方式:SQL 内嵌语法:

C++方式,SQL 内嵌语法,proc编译c++需要配置一下

Pro*C 编程:insert into 向数据库插入数据:

Pro*C 编程:update  向数据库更新数据:

Pro*C 编程:select从数据库查数据:之char数据类型

Pro*C varchar 数据类型,自动去除占位的空格

Pro*C string数据类型,自动去除占位的空格

NULL问题,1,插入数据时,字段填NULL

NULL问题,2,获取数据时,判断是否为NULL

Pro*C/C++ 编程,向Oracle 插入中文

先把Linux,Oracle,Sqlplus设置为UTF8

Oracle 通讯区 和错误处理:

游标的官方文档

游标与数组:查询多条记录,全部插入一张表中

用普通游标提取数据,一行一行的获取数据,就像单向链表

用滚动游标提取数据,可查询指定任意行数据:指哪儿打哪儿

[难点]动态SQL,1,只能使用非select语法

[难点]动态SQL,2,非查询语言, 带固定数量的宿主变量

[难点]动态SQL,3 处理选择列表项(select查询出来的结果列数固定)

[难点]动态SQL4,具备完整select 语法 ANSI方法

[难点]动态SQL4,具备完整select 语法Oracle官方方法

复习

1 求所有部门的平均奖金SQL> select avg(comm) from emp;

AVG(COMM)

----------

550

SQL> select avg(nvl(comm,0)) from emp;

AVG(NVL(COMM,0))

----------------

115.789474

2 求各部门的平均薪水SQL> select deptno, avg(sal) from emp group by deptno;

DEPTNO   AVG(SAL)

---------- ----------

30 1566.66667

20 3839.28571

10     4187.5

3 求各部门每个工种的平均薪水SQL> select deptno, job, avg(sal) from emp group by deptno, job;

DEPTNO JOB         AVG(SAL)

---------- --------- ----------

20 CLERK            950

30 SALESMAN        1400

20 MANAGER         2975

30 CLERK            950

10 PRESIDENT       5000

20 clerk           8000

30 MANAGER         2850

10 CLERK           1300

20

10 MANAGER         2450

20 ANALYST         3000

10                 8000

12 rows selected.

4 求各部门每个工种大于2000的平均薪水SQL> select deptno, job, avg(sal) from emp group by deptno, job having avg(sal) >2000;

DEPTNO JOB         AVG(SAL)

---------- --------- ----------

20 MANAGER         2975

10 PRESIDENT       5000

20 clerk           8000

30 MANAGER         2850

10 MANAGER         2450

20 ANALYST         3000

10                 8000

7 rows selected.

5 求10号部门的平均工资(2种写法)

1:SQL> select deptno,avg(sal) from emp group by deptno having deptno=10;

DEPTNO   AVG(SAL)

---------- ----------

10     4187.5

2:SQL> select deptno,avg(sal) from emp where deptno=10 group by deptno;

DEPTNO   AVG(SAL)

---------- ----------

10     4187.5

6 创建一个学生表sid

sname

email

sex

age

SQL> create table studet (sid number(2) primary key, sname varchar2(50) not null,email varchar2(50), sex varchar2(1),age number(2));

Table created.

SQL> desc studet;

Name              Null?    Type

------------------------- -------- -----------------------

SID               NOT NULL NUMBER(2)

SNAME             NOT NULL VARCHAR2(14)

EMAIL                      VARCHAR2(20)

SEX                        VARCHAR2(1)

AGE                        NUMBER(2)

7 并向表中插入一条数据SQL> insert into studet values(10,'鲁智深','Linux','m',20);

1 row created.

8 列出不是管理层的员工:SQL> select * from emp where empno not in  (select mgr from emp  where mgr is not null);

EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

1 tom_abc                                         8000                    10

2 aaa        clerk           7092 17-DEC-80       8000                    20

3 abc                                                                     20

4 aaa        clerk           7092 26-AUG-16       8000                    20

5 chunli                                                                  20

7369 SMITH      CLERK           7902 17-DEC-80        800                    20

7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

7900 JAMES      CLERK           7698 03-DEC-81        950                    30

7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

9,显示工资最高前10名的员工信息(rownum是一个属性值):SQL> select * from (select * from emp order by sal desc nulls last) where rownum <= 10;

EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

1 tom_abc                                         8000                    10

4 aaa        clerk           7092 26-AUG-16       8000                    20

2 aaa        clerk           7092 17-DEC-80       8000                    20

7839 KING       PRESIDENT            17-NOV-81       5000                    10

7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

7566 JONES      MANAGER         7839 02-APR-81       2975                    20

7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

10 rows selected.

10 ,找到各部门大于本部门平均薪水的员工:SQL> select d.deptno, d.avgsal,e.ename,e.sal from emp e, (select deptno,avg(sal) avgsal from emp group by deptno) d where e.deptno=d.deptno and sal>=avgsal;

DEPTNO     AVGSAL ENAME             SAL

---------- ---------- ---------- ----------

30 1566.66667 ALLEN            1600

30 1566.66667 BLAKE            2850

10     4187.5 KING             5000

10     4187.5 tom_abc          8000

20 3839.28571 aaa              8000

20 3839.28571 aaa              8000

6 rows selected.

创建索引:SQL> desc studet;

Name               Null?    Type

----------------- -------- -------- ------------

SID                NOT NULL NUMBER(2)

SNAME              NOT NULL VARCHAR2(14)

EMAIL                       VARCHAR2(20)

SEX                         VARCHAR2(1)

AGE                         NUMBER(2)

SQL> create index student_index on studet (sname);

SQL> desc studet;

Name             Null?    Type

------------------------ -------- ---------------------

SID              NOT NULL NUMBER(2)

SNAME            NOT NULL VARCHAR2(14)

EMAIL                     VARCHAR2(20)

SEX                       VARCHAR2(1)

AGE                       NUMBER(2)

Linux 环境 Oracle  Pro*C Oracle 编程:

官方文档:Pro*C/C++ Programmer's Guide:

Linux 下Oracle数据库的安装,

配置proc编译器:[oracle@oracle11 proc]$ vim /opt/oracle/app/product/11.2.0/dbhome_1/precomp/admin/pcscfg.cfg

在后面加:/usr/lib/gcc/x86_64-redhat-linux/4.4.4/include

变成这样的:

[oracle@oracle11 ~]$ cat /opt/oracle/app/product/11.2.0/dbhome_1/precomp/admin/pcscfg.cfg

sys_include=($ORACLE_HOME/precomp/public,/usr/include,/usr/lib/gcc-lib/x86_64-redhat-linux/3.2.3/include,/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include,/usr/lib64/gcc/x86_64-suse-linux/4.1.0/include,/usr/lib64/gcc/x86_64-suse-linux/4.3/include,/usr/lib/gcc/x86_64-redhat-linux/4.4.4/include)

ltype=short

define=__x86_64__

[oracle@oracle11 ~]$

如果不配置:

Proc 编译,出现错误PCC-S-02015, unable to open include file

加选项parse=no也可以解决

[配置]vim 为pc文件高亮[oracle@oracle11 ~]$ cat /home/oracle/.vimrc

autocmd BufEnter *.pc set filetype=esqlc

[Proc*C/C++编译配置]proc的头文件在:/opt/oracle/app/product/11.2.0/dbhome_1/precomp/public/

proc的动态库在:/opt/oracle/app/product/11.2.0/dbhome_1/lib/

编译示例:$ proc hello.pc > /dev/null && gcc hello.c  -I/opt/oracle/app/product/11.2.0/dbhome_1/precomp/public/ -L/opt/oracle/app/product/11.2.0/dbhome_1/lib/ -lclntsh  && ./a.out

Oracle数据类型

346113128e5bb0989b964e89bb216fe6.png

proc小试身手[oracle@oracle11 proc]$ cat hello.pc

#include 

#include 

#include 

int main()

{

printf("Hello \n");

return 0;

}

[oracle@oracle11 proc]$

proc编译:[oracle@oracle11 proc]$ proc parse=no hello.pc

gcc 编译:[oracle@oracle11 proc]$ gcc hello.c && ./a.out

Hello

一键联编:

[oracle@oracle11 proc]$ proc hello.pc > /dev/null && gcc hello.c && ./a.out

Hello

[oracle@oracle11 proc]$

C语言方式:SQL 内嵌语法:[oracle@oracle11 proc]$ cat hello.pc

#include 

#include 

#include 

#include "sqlca.h"

//定义宿主变量

EXEC SQL BEGIN DECLARE SECTION;

char *serverid="scott/11@orcl";

EXEC SQL END DECLARE SECTION;

int main()

{

int ret = 0;

printf("Hello \n");

//嵌入式SQL语句必须以 EXEC SQL  开头

EXEC SQL connect:serverid;//妈蛋,这是谁龟腚的语法

if(sqlca.sqlcode != 0)

{

ret = sqlca.sqlcode;

printf("EXEC SQL connect:serverid err \n");

exit(1);

}

printf("connect ok!\n");

return ret;

}

[oracle@oracle11 proc]$ proc hello.pc > /dev/null && gcc hello.c  -I/opt/oracle/app/product/11.2.0/dbhome_1/precomp/public/ -L/opt/oracle/app/product/11.2.0/dbhome_1/lib/ -lclntsh  && ./a.out

Hello

connect ok!

[oracle@oracle11 proc]$

编译很烦:Makefile就好用了

[oracle@oracle11 proc]$ proc hello.pc > /dev/null

[oracle@oracle11 proc]$ gcc hello.c-I/opt/oracle/app/product/11.2.0/dbhome_1/precomp/public/ \

-L/opt/oracle/app/product/11.2.0/dbhome_1/lib/ -lclntsh

[oracle@oracle11 proc]$ ./a.out

C++方式,SQL 内嵌语法:[oracle@oracle11 proc]$ cat c++_hello.pc

#include 

#include 

#include 

#include "sqlca.h"

using namespace std;

//定义宿主变量

EXEC SQL BEGIN DECLARE SECTION;

char *serverid="scott/11@orcl";

EXEC SQL END DECLARE SECTION;

int main()

{

int ret = 0;

//printf("Hello \n");

cout <

//嵌入式SQL语句必须以 EXEC SQL  开头

EXEC SQL connect:serverid;//妈蛋,这是谁龟腚的语法

if(sqlca.sqlcode != 0)

{

ret = sqlca.sqlcode;

cout<

exit(1);

}

cout<

return ret;

}

[oracle@oracle11 proc]$ proc iname=./c++_hello.pc oname=c++_hello.cpp PARSE=NONE CODE=cpp > /dev/null && g++ c++_hello.cpp  -I/opt/oracle/app/product/11.2.0/dbhome_1/precomp/public/ -L/opt/oracle/app/product/11.2.0/dbhome_1/lib/ -lclntsh  && ./a.out

c++_hello.cpp:153: warning: deprecated conversion from string constant to ‘char*’

hello c++ sql

connect ok!

[oracle@oracle11 proc]$

proc编译c++需要配置一下

[oracle@oracle11 proc]

$ proc iname=./c++_hello.pc oname=c++_hello.cpp PARSE=NONE CODE=cpp > /dev/null \

&& g++ c++_hello.cpp  -I/opt/oracle/app/product/11.2.0/dbhome_1/precomp/public/\

-L/opt/oracle/app/product/11.2.0/dbhome_1/lib/ -lclntsh \

&& ./a.out

Pro*C 编程:insert into 向数据库插入数据:[oracle@oracle11 proc]$ cat db_op.pc

#include 

#include 

#include 

#include "sqlca.h"

//定义宿主变量

EXEC SQL BEGIN DECLARE SECTION;

char *serverid="scott/11@orcl";

int deptno = 0;

char dname[20];

char loc[20];

EXEC SQL END DECLARE SECTION;

int main()

{

int ret = 0;

printf("Hello \n");

//嵌入式SQL语句必须以 EXEC SQL  开头

EXEC SQL connect:serverid;

if(sqlca.sqlcode != 0)

{

ret = sqlca.sqlcode;

printf("EXEC SQL connect:serverid err \n");

exit(1);

}

deptno  =50;

strcpy(dname,"oracle");

strcpy(loc,"China");

EXEC SQL insert into dept (deptno,dname,loc) values(:deptno,:dname,:loc);

EXEC SQL commit;

//EXEC SQL commit RELEASE;提交事务并断开连接

printf("connect ok!\n");

return ret;

}

[oracle@oracle11 proc]$ cat comp

INCLUDE_PATH=/opt/oracle/app/product/11.2.0/dbhome_1/precomp/public/

LD_PATH=/opt/oracle/app/product/11.2.0/dbhome_1/lib/

proc db_op.pc

gcc db_op.c  -I$INCLUDE_PATH -L$LD_PATH -lclntsh

./a.out

[oracle@oracle11 proc]$ bash comp

Pro*C/C++: Release 11.2.0.1.0 - Production on Mon Aug 29 03:09:12 2016

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

System default option values taken from: /opt/oracle/app/product/11.2.0/dbhome_1/precomp/admin/pcscfg.cfg

Hello

connect ok!

开一个窗口:验证

SQL> select * from dept;

DEPTNO DNAME  LOC

---------- -------------- -------------

50 oracle  China

10 ACCOUNTING  NEW YORK

20 RESEARCH  DALLAS

30 SALES  CHICAGO

40 OPERATIONS  BOSTON

Pro*C 编程:update  向数据库更新数据:[oracle@oracle11 proc]$ cat db_op.pc

#include 

#include 

#include 

#include "sqlca.h"

//定义宿主变量

EXEC SQL BEGIN DECLARE SECTION;

char *serverid="scott/11@orcl";

int deptno = 0;

char dname[20];

char loc[20];

EXEC SQL END DECLARE SECTION;

int main()

{

int ret = 0;

printf("Hello \n");

//嵌入式SQL语句必须以 EXEC SQL  开头

EXEC SQL connect:serverid;

if(sqlca.sqlcode != 0)

{

ret = sqlca.sqlcode;

printf("EXEC SQL connect:serverid err \n");

exit(1);

}

deptno  =50;

strcpy(dname,"oracle");

strcpy(loc,"England");

EXEC SQL update  dept set loc = :loc where deptno=:deptno;

EXEC SQL commit;

//EXEC SQL commit RELEASE;提交事务并断开连接

printf("connect ok!\n");

return ret;

}

[oracle@oracle11 proc]$

编译小脚本:

[oracle@oracle11 proc]$ cat comp

INCLUDE_PATH=/opt/oracle/app/product/11.2.0/dbhome_1/precomp/public/

LD_PATH=/opt/oracle/app/product/11.2.0/dbhome_1/lib/

proc db_op.pc

gcc db_op.c  -I$INCLUDE_PATH -L$LD_PATH -lclntsh

./a.out

编译:

[oracle@oracle11 proc]$ bash comp

Pro*C/C++: Release 11.2.0.1.0 - Production on Mon Aug 29 03:14:01 2016

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

System default option values taken from: /opt/oracle/app/product/11.2.0/dbhome_1/precomp/admin/pcscfg.cfg

Hello

connect ok!

验证:

SQL> select * from dept;

DEPTNO DNAME  LOC

---------- -------------- -------------

50 oracle  England

10 ACCOUNTING  NEW YORK

20 RESEARCH  DALLAS

30 SALES  CHICAGO

40 OPERATIONS  BOSTON

SQL>

Pro*C 编程:select从数据库查数据:之char数据类型[oracle@oracle11 proc]$ cat db_op.pc

#include 

#include 

#include 

#include "sqlca.h"

EXEC SQL BEGIN DECLARE SECTION;//定义宿主变量

char *serverid="scott/11@orcl";

int deptno = 0;

char dname[20];

char loc[20];

EXEC SQL END DECLARE SECTION;

int main()

{

int ret = 0;

printf("Hello \n

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值