1.什么是pl/sql?
sql:结构化查询语言
pl/sql:(Procedure Language&Structured Query Language)是对sql语言,存储过程语言的拓展。它可以像Java语言等一样实现简单的逻辑编程。
2.pl/sql的优点?
引自博主https://www.cnblogs.com/huyong/archive/2011/05/16/2047329.html 更多详细内容查看原文
1.有利于客户/服务器环境应用的运行
2.适合于客户环境
3.过程化
4.模块化
5.运行错误可处理性
6.提供大量内置程序包
3.pl/sql的使用
declare-- declare 可以省略 --声明部分,在这里声明pl/sql用到的变量,游标,以及局部的存储过程及函数 begin -- 程序开始部分,不可省略,相当于java中的大括号{ --执行部分 过程及sql语句,是程序的主要部分 exception --异常处理部分(可以省略) end; --程序结束部分,不可省略相当于结尾大括号}
pl/sql块可以分为:
1.匿名块:没有名字的语句块,只能执行一次,可以调用其他程序,不能被其他程序调用
2.命名块:带有名称的匿名块,这个名称就是标签
3.子程序:存储在数据库中的存储过程、函数等,当在数据库中建立好后可以在其他程序中调用他们。
4.程序包:存储在数据库中的一组子程序,定义变量,在包中的子程序可以被其他程序包或子程序调用,但如果声明的是局部子程序,则只能在定义该局部子程序的块中调用该局部子程序。
5.触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序
4.标识符
pl/sql中的标识符与sql中的标识符定义基本相同,要求和限制有:
1.标识符名不能超过30个字符
2.第一个字符必须为子母
3.不分大小写
4.不能为-号
5.不能为sql保留字
关于sql命名以及数据类型等https://www.cnblogs.com/huyong/archive/2011/05/10/2041951.html
匿名块举例:
举例:根据员工的编号,查询员工的姓名
declare v_empno number:=7369;--定义变量赋值 (:=) v_ename varchar2(20); begin --解释本句,查询emp表中员工编号为变量v_empno的员工的姓名,将姓名放入变量v_ename中 select ename into v_ename from emp where empno=v_empno; --输出命令,拼接字符串为|| dbms_output.put_line('员工的名字:'||v_ename); end;
pl/sql中变量赋值:
v_empno number:=7369
常量赋值:
v_empno constant number:=7369 --关键字constant表示为常量
引用类型变量:
在pl/sql中,引用类型变量有 :
列引用类型 %type
行引用类型 %rowtype
记录类型 %record
表格类型 %table
举例:
--列引用类型 declare v_empno emp.empno%type;--列引用类型用法需要表名.列名来声明是那儿一列 v_ename varchar(20); begin select empno into v_empno from emp where ename='ALLEN'; dbms_output.put_line('员工编号:'||v_empno); end; --行引用类型 declare v_row emp%rowtype;--行引用类型表名%rowtype表示为那儿张表 v_empno number(7):=7369; begin select * into v_row from emp where empno=v_empno; dbms_output.put_line('员工姓名:'||v_row.ename||'员工部门:'||v_row.job); end; --记录类型(复杂的数据类型) --举例根据员工号查询员工信息 declare --定义一个记录类型,就像创建一个表 一样 type emp_record_type is record( v_empno emp.empno%type,--逗号结尾 v_ename emp.ename%type--最后一条不用逗号 ); v_emp emp_record_type;--声明变量v_emp为记录类型 begin select empno,ename into v_emp from emp where empno=7369;--要注意查询的数据条数要与记录中的条数对应,这里如果是select * 就会报错 dbms_output.put_line('结果为:'||v_emp.v_empno);--输出时必须写明输出的数据是哪儿一条,直接输出v_emp报错 end; --table类型,键值的集合,record的集合 --根据员工号查询员工信息 declare /*定义table类型, of数据类型,基本的数据类型,引用类型.. index by 索引类型*/ type emp_table_type is table of emp%rowtype index by binary_integer; v_emp emp_table_type; begin --错误 select * into v_emp from emp where empno=7369; select * into v_emp(0) from emp where empno=7369; select * into v_emp(1) from emp where empno=7499; dbms_output.put_line(v_emp(0).empno||v_emp(0).ename); dbms_output.put_line(v_emp(1).empno||v_emp(1).ename); end;