--PL/SQL基础知识学习 --一、PL/SQL语句块,基础语法格式 DECLARE --变量声明列表 info varchar(25); --变量声明 stu_unm integer := 15; BEGIN --语句块 info := ‘soulsjie‘; --变量的赋值 DBMS_OUTPUT.put(‘HELLO WORLD!‘); --输出不换行 DBMS_OUTPUT.put_line(info || stu_unm); --输出换行 ||为字符串的连接符 --异常处理块 END; --1.循环 --1.1for循环 DECLARE i INTEGER :=1; j INTEGER :=10; BEGIN FOR S IN i .. j LOOP DBMS_OUTPUT.put_line(‘序号是‘||S); END LOOP; END; --1.2if语句 DECLARE chengji integer; BEGIN chengji :=&temp; DBMS_OUTPUT.put_line(‘您输入的成绩是:‘||chengji); IF chengji>90 THEN --注意不需要‘;’号 DBMS_OUTPUT.put_line(‘优秀‘); ELSIF chengji>=60 THEN --注意不是ELSEIF DBMS_OUTPUT.put_line(‘及格‘); ELSE DBMS_OUTPUT.put_line(‘不及格‘); END IF; END; --1.3while循环 DECLARE chengji integer :=10; BEGIN WHILE chengji>0 LOOP DBMS_OUTPUT.put_line(chengji); chengji :=chengji-1; END LOOP; END; --1.4do whlie 循环 DECLARE i INTEGER :=12; BEGIN LOOP DBMS_OUTPUT.put_line(i); i:=i-1; EXIT WHEN i=0; END LOOP; END; --1.5case 语句 DECLARE i VARCHAR(20); BEGIN i :=‘&temp‘; CASE i WHEN ‘y‘ THEN DBMS_OUTPUT.put_line(‘您选择了是‘); WHEN ‘n‘ THEN DBMS_OUTPUT.put_line(‘您选择了否‘); ELSE DBMS_OUTPUT.put_line(‘默认项‘); END case; END; SELECT I.STU_ID 学号, (CASE I.STU_SEX WHEN ‘男‘ THEN ‘1‘ WHEN ‘女‘ THEN ‘0‘ ELSE ‘未知‘ END) FROM STU_INFO I; --1.6 GOTO 语句 --创建节点,跳转到指定节点 DECLARE BEGIN <<a>> DBMS_OUTPUT.put_line(‘A‘); goto c; <<b>> DBMS_OUTPUT.put_line(‘B‘); <<c>> DBMS_OUTPUT.put_line(‘C‘); END; --2.SELECT INTO 的用法。统计学生信息表中的学生总数 --select into 将查询到的结果赋给变量 DECLARE TEMP INTEGER; us_name VARCHAR(20); BEGIN SELECT COUNT(*) INTO TEMP FROM (SELECT DISTINCT STU_ID FROM STU_INFO);--查询学生信息记录条总数 DBMS_OUTPUT.put_line(‘总记录条数有‘||TEMP||‘条‘); SELECT I.STU_NAME INTO us_name FROM STU_INFO I WHERE I.STU_ID=‘180301‘;--查询指定账号的学生姓名 DBMS_OUTPUT.put_line(‘姓名是:‘||us_name); END; --3.cursor 利用游标读取数据 遍历一个记录集 --%ISOPEN(游标是否已经打开) /%FOUND(遍历到数据) /%NOTFOUND(未遍历到数据) /%ROWCOUNT(遍历到数据的记录条数) DECLARE CURSOR youbiao1 IS SELECT * FROM STU_INFO I WHERE I.STU_SEX=‘男‘; --a.创建一个游标 temp youbiao1%rowtype;--b.创建一个变量 记录每行内容 BEGIN IF NOT youbiao1%ISOPEN THEN OPEN youbiao1;--c.若该游标未打开则打开该游标 DBMS_OUTPUT.put_line(‘游标已被打开‘); END IF; LOOP --d.利用循环让游标读取数据 FETCH youbiao1 INTO temp; EXIT WHEN youbiao1%NOTFOUND;--e.当记录读取完毕跳出循环 DBMS_OUTPUT.put_line(temp.STU_NAME); END LOOP; CLOSE youbiao1;--f.关闭游标 DBMS_OUTPUT.put_line(‘游标已关闭‘); END; --4.异常处理 DECLARE aa INTEGER; BEGIN aa:=1/0;--函数执行 EXCEPTION WHEN OTHERS THEN--异常处理块 DBMS_OUTPUT.put_line(‘出现异常!‘); END; --二、函数的创建和使用 /*基本格式 CREATE [OR REPLACE] FUNCTION FUN_NAME [(参数1 参数类型, 参数2 参数类型, 参数n 参数类型)] RETURN 返回值类型 IS BEGIN 函数体 RETURN 具体的返回值; END FUN_NAME; */ --创建无参数函数 CREATE OR REPLACE FUNCTION F_WUCANSHU RETURN INTEGER IS BEGIN RETURN 3+6; END F_WUCANSHU; SELECT F_WUCANSHU FROM DUAL;--函数的调用 --创建有参函数 CREATE OR REPLACE FUNCTION F_YOUCANSHU(num1 INTEGER,num2 INTEGER) RETURN INTEGER IS BEGIN RETURN (num1*num2); END F_YOUCANSHU; SELECT F_YOUCANSHU(&数字1,&数字2) 乘积是 FROM DUAL;--调用有参函数 --创建函数 按照用户输入的学生学号查询该学生的姓名信息 CREATE OR REPLACE FUNCTION F_SEARCH_NAME(stu_id VARCHAR) RETURN VARCHAR --注意参数的声明不带长度,如:(stu_id VARCHAR) IS temp VARCHAR(20); stu VARCHAR(20); BEGIN stu:=stu_id; SELECT DISTINCT STU_NAME INTO temp FROM STU_INFO WHERE STU_ID=stu;--将查询到的学号保存到变量temp中 RETURN temp;--将结果返回 END F_SEARCH_NAME; SELECT F_SEARCH_NAME(‘&请输入要查询的学号‘) 查询结果 FROM DUAL; --三、过程的创建和使用 --完成数据库中特定的任务,可以永久保存在数据库中供其他程序使用 --3.1过程创建的基本格式 /*CREATE [OR REPLACE] PROCEDURE PRO_NAME [参数名 IN 参数类型, ... 参数N IN 参数N的类型] IS BEGIN //过程要执行的代码体 END; */ CREATE OR REPLACE PROCEDURE insert_stuinfo( stu_id IN VARCHAR,--注意在声明参数的类型时不加长度 与函数的参数声明(canshu VARCHAR)不同 stu_name IN VARCHAR, stu_class IN VARCHAR, stu_sex IN VARCHAR ) IS BEGIN INSERT INTO STU_INFO VALUES(stu_id,stu_name,stu_class,stu_sex);--过程要执行的SQL语句块 END; CALL insert_stuinfo(‘jie‘,‘jie‘,‘jie‘,‘jie‘);--存储过程的调用