首页 > 编程学习 > 【数据库】第八章数据库编程知识点汇总

1、建立数据库连接
EXEC SQL CONNECT TO target[AS connection-name][USER user-name];
 target是要连接的数据库服务器
常见的服务器标识串,如
《dbname》@《hostname》:《port》
包含服务器标识的SQL串常量
 DEFAULT
关闭数据库连接
EXEC SQL DISCONNECT [connection];
例题:依次检查某个系的学生记录,交互式更新某些学生年龄。
EXEC SQL BEGIN DECLARE SECTION; /主变量说明开始/
char Deptname[20];
char Hsno[9];
char Hsname[20];
char Hssex[2];
int HSage;
int NEWAGE;
EXEC SQL END DECLARE SECTION; /主变量说明结束/
long SQLCODE;
EXEC SQL INCLUDE SQLCA; /定义SQL通信区/

int main(void) /*C语言主程序开始*/
{
    int count = 0;
    char yn; /*变量yn代表yes或no*/
    printf("Please choose the department name(CS/MA/IS): "); 
    scanf("%s",deptname); /*为主变量deptname赋值*/
    EXEC SQL CONNECT TO TEST@localhost:54321 USER
    "SYSTEM"/"MANAGER"; /*连接数据库TEST*/
    EXEC SQL DECLARE SX CURSOR FOR /*定义游标SX*/
    SELECT Sno,Sname,Ssex,Sage /*SX对应的语句*/
    FROM Student
    WHERE SDept = :deptname;
    EXEC SQL OPEN SX; /*打开游标SX,指向查询结果的第一行*/
    for ( ; ; ) /*用循环结构逐条处理结果集中的记录*/
    { 
        EXEC SQL FETCH SX INTO :HSno,:Hsname,:HSsex,:HSage;
        /*推进游标,将当前数据放入主变量*/
        if (SQLCA.SQLCODE!= 0) /*SQLCODE != 0,表示操作不成功*/
            break; /*利用SQLCA中的状态信息决定何时退出循环*/
        if(count++ == 0) /*如果是第一行的话,先打出行头*/
            printf("\n%-10s %-20s %-10s %-10s\n","Sno“,"Sname“,"Ssex", "Sage");
        printf("%-10s %-20s %-10s %-10d\n“,HSno,Hsname,Hssex,HSage); /*打印查询结果*/
        printf(“UPDATE AGE(y/n)?”); /*询问用户是否要更新该学生的年龄*/
        do{scanf("%c",&yn);}
        while(yn != 'N' && yn != 'n' && yn != 'Y' && yn != 'y');
        if (yn == 'y' || yn == 'Y') /*如果选择更新操作*/
        {
            printf("INPUT NEW AGE:");
            scanf("%d",&NEWAGE); /*用户输入新年龄到主变量中*/
            EXEC SQL UPDATE Student /*嵌入式SQL更新语句*/
            SET Sage = :NEWAGE
            WHERE CURRENT OF SX;
         } /*对当前游标指向的学生年龄进行更新*/
    }
    EXEC SQL CLOSE SX; /*关闭游标SX,不再和查询结果对应*/
    EXEC SQL COMMIT WORK; /*提交更新*/
    EXEC SQL DISCONNECT TEST; /*断开数据库连接*/
}

2、根据学生号码查询学生信息。
EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept
INTO:Hsno,:Hname,:Hsex,:Hage,:Hdept
FROM Student
WHERE Sno=:givensno;
/把要查询的学生的学号赋给为了主变量givensno/
3、修改某个学生选修1号课程的成绩。
EXEC SQL UPDATE SC
SET Grade=:newgrade
/修改的成绩已赋给主变量:newgrade/
WHERE Sno=:givensno;
/学号赋给主变量:givensno/
4、必须使用游标的SQL语句
 查询结果为多条记录的SELECT语句
 CURRENT形式的UPDATE语句
 CURRENT形式的DELETE语句
5、说明游标的语句格式
EXEC SQL DECLARE <游标名> CURSOR
FOR <SELECT语句>;
打开:EXEC SQL OPEN <游标名>;
推进:EXEC SQL FETCH <游标名>
INTO <主变量>[<指示变量>]
[,<主变量>[<指示变量>]]…;
关闭:EXEC SQL CLOSE <游标名>;
6、条件控制语句: IF-THEN,IF-THEN-ELSE和嵌套的IF语句
(1)IF condition THEN
Sequence_of_statements;
END IF;
(2)IF condition THEN
Sequence_of_statements1;
ELSE
Sequence_of_statements2;
END IF;
(3)在THEN和ELSE子句中还可以再包含IF语句,即IF语句可以嵌套
7、循环控制语句
LOOP,WHILE-LOOP和FOR-LOOP
(1)简单的循环语句LOOP
LOOP
Sequence_of_statements;
END LOOP;
(2)WHILE-LOOP
WHILE condition LOOP
Sequence_of_statements;
END LOOP;
(3)FOR-LOOP
FOR count IN [REVERSE] bound1 … bound2 LOOP
Sequence_of_statements;
END LOOP;
8、利用存储过程来实现下面的应用:从账户1转指定数额的款项到账户2中。
CREATE OR REPLACE PROCEDURE
TRANSFER(inAccount INT,outAccount INT,amount FLOAT)
/定义存储过程TRANSFER,其参数为转入账户、转出账户、转账额度/
AS DECLARE /定义变量/
totalDepositOut Float;
totalDepositIn Float;
inAccountnum INT;
BEGIN /*检查转出账户的余额 /
SELECT Total INTO totalDepositOut FROM Accout
WHERE accountnum=outAccount;
IF totalDepositOut IS NULL THEN
/如果转出账户不存在或账户中没有存款/
ROLLBACK; /回滚事务/
RETURN;
END IF;
IF totalDeposit Out< amount THEN /如果账户存款不足/
ROLLBACK; /回滚事务/
RETURN;
END IF;
SELECT Accountnum INTO inAccountnum FROM Account
WHERE accountnum=inAccount;
IF inAccount IS NULL THEN /如果转入账户不存在/
ROLLBACK; /回滚事务/
RETURN;
ENDIF;
UPDATE Account SET total=total-amount
WHERE accountnum=outAccount;
/
修改转出账户余额,减去转出额 /
UPDATE Account SET total=total + amount
WHERE accountnum=inAccount;
/
修改转入账户余额,增加转入额 /
COMMIT; /
提交转账事务 */
END;
应用:(1)从账户01003815868转10000元到01003813828账户中。
CALL PROCEDURE
TRANSFER(01003813828,01003815868,10000)
(2)修改存储过程
ALTER PROCEDURE 过程名1 RENAME TO 过程名2;
(3)删除存储过程
DROP PROCEDURE 过程名();

Copyright © 2010-2022 mfbz.cn 版权所有 |关于我们| 联系方式|豫ICP备15888888号