第八章 数据库编程
8.1 嵌入式SQL(C语言版)
被嵌入的语言(java ,C++)等被称为宿主语言,简称主语言
-
当主语言 为 C 语言的时候
语法格式为
EXEC SQL <SQL语句>
-
当主语言为java的时候
格式为
#SQL {<SQL语句>}
以下讲解是C语言
数据库的连接和断开
SQL执行的提交与撤销
示例
#include <stdio.h>
#include “prompt.h”
exec sql include sqlca;
char cid_prompt[ ] = “Please enter customer id: ”;
int main()
{ exec sql begin declare section;
char cust_id[5], cust_name[14];
float cust_discnt;
char user_name[20],user_pwd[20];
exec sql end declare section;
exec sql whenever sqlerror goto report_error;
exec sql whenever not found goto notfound;
strcpy(user_name, “poneilsql”);
strcpy(user_pwd, “XXXX”);
exec sql connect :user_name identified
by :user_pwd;
while((prompt(cid_prompt,1,cust_id,4)) >=0) {
exec sql select cname,discnt
into :cust_name, :cust_discnt
from customers where cid=:cust_id;
exec sql commit work;
printf(“Customer’s name is %s and discount
is %5.1f\n”,cust_name,cust_discnt);
continue;
notfound: printf(“Can’t find customer %s,
continuing\n”,cust_id); }
exec sql commit release;
return 0;
report_error:
print_dberror();
exec sql rollback release;
return 1;
}
游标
- 检索单行结果,可将结果直接传送到宿主程序的变量中
EXEC SQL SELECT [ALL | DISTINCT] expression [, expression…]
INTO host-variable , [host-variable, …]
FROM tableref [corr_name] [ , tableref [corr_name] …]
WHERE search_condition;
example
exec sql select Sname, Sage into :vSname, :vSage from Student where
Sname = :specName ;
-
检索多行结果,则需使用游标(Cursor)
- 游标是指向某检索记录集的指针
- 通过这个指针的移动,每次读一行,处理一行,再读一行… , 直至 处理完毕
#define TRUE 1
#include <stdio.h>
#include “prompt.h”
exec sql include sqlca;
exec sql begin declare section;
char cust_id[5], agent_id[14];
double dollar_sum;
exec sql end declare section;
int main()
{ char cid_prompt[ ]=“Please enter customer ID:”;
exec sql declare agent_dollars cursor for select aid,sum(dollars)
from orders where cid = :cust_id group by aid;
exec sql whenever sqlerror goto report_error;
exec sql connect to testdb;
exec sql whenever not found goto finish;
while((prompt(cid_prompt,1,cust_id,4)) >=0) {
exec sql open agent_dollars;
while(TRUE) {
exec sql fetch agent_dollars into :agent_id, :dollar_sum;
printf(“%s %11.2f\n”,agent_id, dollar_sum);
}
finish: exec sql close agent_dollars;
exec sql commit work;
}
exec sql disconnect current;
return 0;
report_error:
print_dberror();
exec sql rollback;
exec sql disconnect current;
return 1;
}
通过QDBC可以使游标移动,进行增删改
异常
SQLCA
SQLCA是一个已被声明过的具C语言的结构形式的内存信息区,其中的成员变 量用来记录SQL语句执行的状态,便于宿主程序读取与处理 SQLCA是DBMS(执行SQL语句)与宿主程序之间交流的桥梁之一
8.2过程化sql
变量的声明与使用
流程控制
8.3存储过程
创建存储过程
CREATE OR REPLACE PROCEDURE 过程名([参数1,参数2,…]) AS <过程化SQL块>;
过程名:数据库服务器合法的对象标识
参数列表:用名字来标识调用时给出的参数值,必须指定值的数据类型。参数也可以定义输入参数、输出参数或输入/输出参数,默认为输入参数
过程体:是一个<过程化SQL块>,包括声明部分和可执行语句部分
执行存储过程
CALL/PERFORM PROCEDURE 过程名([参数1,参数2,…]);
修改存储过程
ALTER PROCEDURE 过程名1 RENAME TO 过程名2;
删除存储过程
DROP PROCEDURE 过程名();