PL/SQL
pl/sql的基本概念
PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询组织在PL/SQL代码的过程中,通过逻辑判断、循环等操作实现复杂的功能或者计算。PL/SQL只有Oracle数据库有。
DEMO:第一个pl/sql程序
BEGIN --表示开始过程
NULL; --过程代码
END;--过程结束
/
DEMO:输出hello world
--开启打印功能
SET SERVEROUTPUT ON;
BEGIN --表示开始过程
DEMS_OUTPUT.put_line('Hello world'); --过程代码
END; --过程结束
/
定义变量
DECLARE
v_num NUMBER; --声明一个全局变量
BEGIN --表示开始过程
DBMS_OUTPUT.put_line('变量的值是:'|| v_num); --过程代码
END; --过程结束
/
- 字符串的连接使用的不是 “+” 而是 "||"
- 全局变量的声明放在DECLARE关键字之后
- 如果声明了变量但是没有赋值则默认就是空
为变量赋值
DECLARE
v_num NUMBER; --定义了变量
BEGIN --表示开始过程
v_num=30; --为变量赋值
DBMS_OUTPUT.put_line('变量的值是:' || v_num ); --过程代码
END;
/
给变量设置默认值
DECLARE
v_num NUMBER:=100;
BEGIN
DBMS_OUTPUT.put_line('变量的值是:' || v_num );
END;
/
可以在DECLARE后面声明变的时候给出默认值,如果在BEGIN之后没有为变量赋新的值则按照默认的值输出。
根据雇员的编号查询出雇员的名字
DECLARE
v_empo NUMBER; --保存雇员编号
v_ename VARCHAR2(100); --保存编号
BEGIN --表示开始过程
DBMS_OUTPUT.put_line(‘请输入编号!’);
v_empno:=&empno;
--开始查询
SELECT ename INTO v_ename
FROM emp
WHERE empno=v_empno;
DBMS_OUTPUT.put_line('编号是:' || v_empno ||', 名字是: ' ||
v_ename); --过程代码
END; --过程结束
/
pl/sql中的程序控制
定义常量
DECLARE
v_empno CONSTANT NUMBER;
BEGIN
DBMS_OUTPUT.put_line('编号是:' || v_empno);
END;
/
DECLARE
v_empno CONSTANT NUMBER:='7788';--常量必须有初始值
BEGIN
DBMS_OUTPUT.put_line('编号是:' || v_empno);
END;
/
使用%TYPE定义变量的类型
DECLARE
v_empno emp.empno%type; --表示变量的类型就是emp数据中的empno字段的类型(number)
v_ename emp.ename%TYPE; -- 表示变量的类型就是emp数据表中的ename 字段的类型(VARCHAR2)
BEGIN
DBMS_OUTPUT.put_line('请输入编号!');
v_empno:=&empno;;
SELECT ename INTO v_ename
FROM emp
WHERE empno=v_empno;
DBMS_OUTPUT.put_line('编号是:' || v_empno ||', 名字是: ' || v_ename);
END;
/
- “表名.字段名%TYPE”: 让变量的类型为指定的表的字段的类型
使用%ROWTYPE声明变量
DECLARE
v_empno emp.empno%type; --表示变量的类型就是emp数据中的empno字段的类型(number)
v_result emp%ROWTYPE; -- 表示该变量可以接受查询到的所有字段的数据
BEGIN
DBMS_OUTPUT.put_line('请输入编号!');
v_empno:=&empno;;
SELECT * INTO v_result
FROM emp
WHERE empno=v_empno;
DBMS_OUTPUT.put_line('编号是:' || v_empno ||', 名字是: ' || v_ename);
END;
/
IF使用
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count
FROM emp;
IF v_count>10 THEN
DBMS_OUTPUT.put_line(‘数据量大于10’);
END IF; --表示if结束
END; --过程结束
/
if else
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count
FROM emp;
IF v_count>10 THEN
DBMS_OUTPUT.put_line(‘数据量大于10’);
ELSE
DBMS_OUTPUTput_line('数值量小于或者等于10');
END IF; --表示if结束
END; --过程结束
/
多if结构
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count
FROM emp WHERE job='SALESMAN';
IF v_count>10 THEN
DBMS_OUTPUT.put_line(‘数据量大于10’);
ELSIF v_count<10 THEN
DBMS_OUTPUT.put_line('数据量小于10');
ELSE
DBMS_OUTPUT.put_line('数据量等于10');
END IF; --表示if结束
END; --过程结束
/