PL/SQL的基本概念
PL/SQL也是一种程序语言,叫做过程化SQL语言。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据库和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算。PL/SQL只有Oracle数据库有。
DEMO:第一个pl/sql程序
BEGIN --表示开始过程
NULL;---过程代码
END;--过程结束
/
SET SERVEROUTPUT ON;//开启打印功能
BEGIN
DBMS_OUTPUT.put_line('hello world');
END;
/
定义变量
DECLARE
v_num NUMBER;
BEGIN
DBMS_OUTPUT.put_line('变量的值是:'||v_num);
END;
/
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;
/
运行结果如下:
DEMO:根据雇员的编号查询出雇员的名字(而且要求编号从键盘输入)
DECLARE
v_empno NUMBER;
v_ename VARCHAR2(10);
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;
/
DEMO:为变量设置默认值
DECLARE
v_empno NUMBER NOT NULL:='7788';
BEGIN
DBMS_OUTPUT.put_line('编号是:'||v_empno);
END;
/
DEMO:定义常量
DECLARE
v_empno CONSTANT NUMBER;
BEGIN
DBMS_0UTPUT.put_line('编号是:'||v_empno);
END;
/
DECLARE
v_empno CONSTANT NUMBER:=7788;--常量必须有初始值
BEGIN
DBMS_OUTPUT.put_line('编号是:'||v_empno);
END;
/
常量使用CONSTANT修饰,必须有初始化值
DEMO:常量不能改变
DECLARE
v_empno CONSTANT NUMBER:=7788;
BEGIN
v_empno:=7369;
DBMS_OUTPUT.put_line('编号是:'||v_empno);
END;
/
此时表明常量不能重新赋值的。
DEMO:使用%TYPE定义变量的类型
DECLARE
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
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”:让变量的类型为指定的表的字段的类型
DEMO:使用%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_result.ename||',职位:'
||v_result.job||',部门编号:'||v_result.deptno);
END;
/
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;--过程结束
/
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');
ELSE
DBMS_OUTPUT.put_line('数据量小于或等于10');
END IF;
END;
/
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;
END;
/
存储过程procedure是一组为了完成特定功能的SQL语句集合,之前的pl/sql只能编写一次执行一次或者多次,但是不能将其保存起来下一次使用,关闭窗口之后pl/sql语句就失效了。通过经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来调用。存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。
DEMO:创建过程
CREATE OR REPLACE PROCEDURE hello_say
AS
BEGIN
DBMS_OUTPUT.put_line('hello world');
END;
/
此时就表示创建了一个过程,之后可以通过过程名称hello_say来调用
DEMO:调用过程(使用pl/sql)
BEGIN
hello_say();
END;
/
DEMO:使用命令执行存储过程
EXEC hello_say();
CREATE OR REPLACE PROCEDURE pro_count(
a NUMBER,
b NUMBER
)
AS
BEGIN
DBMS_OUTPUT.put_line('a+b='||(a+b));
END;
/
EXEC pro_count(20,30);
BEGIN
pro_count();
END;
/
CREATE OR REPLACE PROCEDURE pro_count(
a NUMBER:=500,
b NUMBER:=300
)
AS
BEGIN
DBMS_OUTPUT.put_line('a+b='||(a+b));
END;
/
EXEC pro_count();
CREATE OR REPLACE PROCEDURE proc_count(
a NUMBER:=300,
b NUMBER:=700)
AS
result NUMBER;
BEGIN
result:=a+b;
DBMS_OUTPUT.put_line('a+b='||result);
END;
/
EXEC proc_count(20,30);
CREATE OR REPLACE PROCEDURE proc_count(
a IN NUMBER:=30,
b IN NUMBER:=70,
c OUT NUMBER
)
AS
BEGIN
c:=a+b;
END;
/
DECLARE
r NUMBER;--声明全局变量
BEGIN
proc_count(20,30,r);
DBMS_OUTPUT.put_line('r的值是:'||r);
END;
/
IN修饰则表示该参数需要在调用的时候传递进来,OUT修饰的参数则表示可以被返回,如果不写默认就是IN。