相当于“过程”(方法/函数),使数据库具备过程化处理能力(分支循环等)不区分大小写
程序结构
DECLARE
-- 变量声明区(变量和游标的声明)
I INTEGER;
BEGIN
-- 执行区(相当于方法)
END;
Hello Word
BEGIN
DBMS_OUTPUT.PUT_LINE("Hello Word");
END;
变量
普通类型(char varchar2 date number boolean long)
-- 变量名 变量类型 (变量长度)
v_name varchar2(20);
DECLARE
v_name VARCHAR2(20) := "张三";
v_sal NUMBER;
v_addr VARCHAR2(200);
BEGIN
v_sal := 50000;
SELECT addr INTO v_addr FROM bual WHERE name = "张三";
DBMS_OUTPUT.PUT_LINE('姓名:' || v_name || '薪水' || v_sal || '地址' || v_addr);
END;
特殊类型 (引用型变量,记录型变量)
-- 表名.列名%TYPE指定变量的类型和长度
v_name emp.ename%TYPE;
DECLARE
v_name VARCHAR2(20);
v_sal NUMBER;
BEGIN
SELECT ENAME, SAL INTO v_name,v_sal FROM EMP WHERE EPNO = 12;
DBMS_OUTPUT.PUT_LINE('姓名:' || v_name || '薪水' || v_sal);
END;
DECLARE
v_name EMP.ENAME%TYPE;
v_sal EMP.SAL%TYPE;
BEGIN
SELECT ENAME, SAL INTO v_name,v_sal FROM EMP WHERE EPNO = 12;
DBMS_OUTPUT.PUT_LINE('姓名:' || v_name || '薪水' || v_sal);
END;
-- 变量名称 表名%ROWTYPE
V_EMP EMP%ROWTYPE;
DECLARE
V_emp EMP%ROWTYPE
BEGIN
SELECT * INTO v_emp FROM EMP WHERE EMPNO = 123;
DBMS_OUTPUT.PUT_LINE('姓名' || V_emp.ename);
END;
流程控制
条件分支
BEGIN
IF 条件1 THEN 执行1
ELSIF 条件2 THEN 执行2
ELSE 执行3
END IF;
END;
循环
BEGIN
LOOP
EXIT WHEN 推出循环条件
END LOOP;
END;
游标(CURSOR)
用于临时存储一个查询返回的多行数据(结果集)
游标属性
游标属性 | 返回值类型 | 说明 |
---|
%ROWCOUNT | 整型 | 获得FETCH返回的数据行数 | %FOUND | 布尔 | 最近的FETCH语句返回一行数据则为真,否则为假(游标里面有没有东西) | %NOTFOUND | 布尔 | 与%FOUND返回值相反 | %ISOPEN | 布尔 | 游标已经打开时为真 |
DECLARE
-- 声明游标
CURSOR c_emp IS SELECT ENAME,SAL FROM EMP;
-- 声明变量
v_name EMP.ENAME%TYPE;
v_sal EMP.SAL%TYPE;
BEGIN
-- 打开游标
OPEN c_emp;
LOOP
-- 读取游标
FETCH c_emp INTO v_name,v_sal;
-- 推出循环的条件
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('姓名:' || v_name || '薪水' || v_sal);
END LOOP;
-- 关闭游标
CLOSE c_emp;
END;
DECLARE
-- 声明有参数的有标
CURSOR c_emp(v_deptno EMP.DEPTNO%TYPE) IS SELECT ENAME,SAL FROM EMP WHERE DEPTNO = v_deptno;
v_name EMP.ENAME%TYPE;
v_sal EMP.SAL%TYPE;
BEGIN
-- 打开有参游标并传参
OPEN c_emp(12);
LOOP
FETCH c_emp INTO v_name,v_sal;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('姓名:' || v_name || '薪水' || v_sal);
END LOOP;
CLOSE c_emp;
END;
|