plsql基础

pl/sql

Procedual language/structured query language(程序语言/结构化查询语言)

sql语言只是访问,操作数据库的语言,而并不是一种程序设计语言,因此不能用于程序开发
pl/sql是oracle在标准sql语言上进行过程性扩展后形成的程序设计语言

plsql匿名代码块结构

declare
  --声明部分,主要包含变量的声名,类型的定义等

begin
  --plsql代码,主要包含流程控制语句,增删改查语句

exception
  --异常处理代码,当程序出现错误时执行这一部分

end;

注释

declare
  --单行注释,两个中划线后面的内容为注释
begin
  /*多行注释
    我是注释
    **,我也是注释
  */
end;

获取键盘输入的值

用一个变量承接键盘输入

declare
  v_name emp.ename%type;
  v_empno number(20):=&编号;
begin
  select ename into v_name from emp where empno=v_empno;
  dbms_output.put_line(v_name);
end;

直接用列名承接键盘输入

declare
  v_name emp.ename%type;
begin
  select ename into v_name from emp where empno=&empno;
  dbms_output.put_line(v_name);
end;

变量和常量

  • 变量
    • 内容可变,一般以v_开头
  • 常量
    • 内容不能变更,声明时用constant关键字,可以用c开头

变量的定义

变量名 数据类型[:=默认值];

常量的定义

常量名 constant 数据类型:=初始值;

变量名,常量名,存储过程名,函数名,触发器名等,都叫做标识符

  • 标识符的命名规范
    • 可以有数字,字母,下划线,$等,只能以字母开头,长度不超过30个字符
    • 不能使用oracle中的关键字作为标识符的名字
declare
  v_str1 varchar2(20);  --声明字符串变量
  v_str2 varchar200(20):='abc';   --声明变量时设置初始值
  PI constant number(15,14):=3.1415926;  --声明常量
begin
  v_str1:='abc';  --将变量的值设置为'abc'
  dbms_output.put_line(v_str1||v_str2||PI);  --输出到屏幕
end;

输出屏幕abcabc3.1415926

特殊的数据类型

1,%type类型

  • type类型
    • 将数据库表中的某个字符的类型,作为一个类型
  • 语法
    • 变量名 表名.列名%type
  /*empno的类型是number(4),v_empno的类型就是number(4),相当于v_empno 
number(4);*/

  v_empno emp.empno%type;

2,record类型

record类型:是记录类型,它可以存放多个值

使用时需要先声名一个记录类型(定义一个类型),根据定义的类型去声名变量

type 类型名 is record(
   属性名 数据类型 [not null] [:=默认值],
   属性名 数据类型,
   属性名 数据类型,
   ..
   属性名 数据类型
);

记录类型变量的声名:

变量名 记录类型名;

记录类型的使用:

不能直接使用变量名等于一个普通的数据.

变量名.属性名:=值; --记录类型的赋值(给记录类型的属性赋值)
变量名.属性名; --取一个记录变量的属性值 

例子

declare
  --声明一个记录类型,有两个属性,一个数字类型,一个字符串类型
  type my_type is record(
    n number(4):=1,
    str varchar2(20)
  );
  
  --声明一个记录类型变量
  v_rec my_type;
  
begin

  --打印记录类型默认的n属性的值
  dbms_output.put_line(v_rec.n);

  --修改记录类型的属性值
  v_rec.n:=9;
  v_rec.str:='abc';

  --打印n和str的值
  dbms_output.put_line(v_rec.n||' - '||v_rec.str);
end;

3,%rowtype类型

  • %rowtype类型:
    • 它是%type类型和record类型的结合,表示声名一个记录类型,它属性和某个表中的列相同(包含属性名和列名的相同,以及数据类型也相同)

声明

变量名 表名%rowtype;

使用

变量名.属性名

例子

declare
  /*声明一个dept表的%rowtype 类型的变量
  它相当于如下代码
  type dept_type is record(
    deptno dept.deptno%type,
    dname dept.dname%type,
    loc dept.loc%type
  );*/
  v_dept dept%rowtype;

begin

  --给v_dept的各个属性赋值
  v_dept.DEPTNO:=10;
  v_dept.DNAME:='CLERK';
  v_dept.LOC:='qingdao';

  --打印v_dept的属性值
  dbms_output.put_line(v_dept.deptno||' - '||
                       v_dept.DNAME||' - '||
                       v_dept.LOC);
end;

简单增删改查

查询数据

plsql代码块中不能直接使用select语句

  • select into语句相当于在之前的sql语句中添加into
    • 表示将sql语句的查询结果保存到into后面的变量中
  • lect into语句的查询结果只能是一条记录
    • 查不到数据或者查到超过一条语句,就会报错
declare
  --声明一个变量用来保存员工的姓名
  v_name emp.ename%type;
begin
  --将员工编号为7654的员工姓名查询出来,保存到变量v_name中
  select ename into v_name from emp where empno=7654;
  --输出到屏幕
  dbms_output.put_line(v_name);
end;
declare
  --声明一个%rowtype类型的变量用来保存一条员工信息
  v_emp emp%rowtype;
begin
  --查询出7369的员工信息保存到变量v_emp中
  select * into v_emp from emp where empno=7369;
  
  --打印v_emp
  dbms_output.put_line(v_emp.empno||' , '||
                       v_emp.ename||' , '||
                       v_emp.deptno||' , '||
                       v_emp.sal);
end;

更新数据

begin
  update emp set sal=900 where empno=7777;
  commit;
end;

插入数据

begin
  insert into emp(empno,ename,job,sal,deptno) 
    values(7922,'lisa','clerk',1600,30);
  commit;
end;

删除数据

begin
  delete from emp where empno=7922 and ename='lisa';
  commit;
end;

execute immediate语句

查询数据

execute immediate select语句 into 变量;

这种语法只能查出一条数据,into后面的变量用来存放sql语句的执行结果

declare
  --声明一个变量保存员工姓名
  v_name varchar2(30);
begin
  --使用execute immediate语句查询出员工7369的姓名
  execute immediate 'select ename from emp where empno=7369' 
into v_name;
  --打印员工的姓名
  dbms_output.put_line(v_name);
end;
declare
  --声明一个变量保存员工姓名
  v_name varchar2(30);
  --声明一个变量保存查询代码
  v_select varchar(200):='select ename from emp where 
empno=7369';

begin
  --使用execute immediate语句查询出员工7369的姓名
  execute immediate v_select into v_name;
  --打印员工的姓名
  dbms_output.put_line(v_name);

end;

插入数据

增删改类似

declare
  --声明一个变量用来保存sql语句
  v_sql varchar(255);

begin 
  --给sql变量赋值
  v_sql:=q'[insert into emp(empno,ename,deptno) 
          values(9123,'june',10)]';
  --执行
  execute immediate v_sql;
  commit;
end;

若执行的代码中包含单引号时,可以使用q'[]'包裹语句赋到变量,也可以将代码中的单引号改为双引号:

执行建表语句

declare
  --声明一个变量保存sql语句
  v_sql varchar2(255);

begin
  v_sql:='create table t3(id number(11),name varchar2(40))';
  execute immediate v_sql;
end;

execute immediate的传值

declare
  --声明一个变量用于保存sql语句
  v_sql varchar2(255);
  --声明一个变量存储员工姓名
  v_name varchar2(20);

begin
  --sql语句中使用占位符
  v_sql:='select ename from emp where empno=:1';
  --执行sql语句,并使用using给sql语句传值
  execute immediate v_sql into v_name using 7777;
  --打印
  dbms_output.put_line(v_name);

end;

:n表示在execute immediate中的参数占位符,n可以是自然数据,从1开始
using后面是传给sql语句的值,它顺序和参数占位符的位置相对应

declare
  --声明变量,用于存储sql语句
  v_sql varchar2(255);
  --声明变量,用于查询结果
  v_job varchar2(40);

begin
  --给v_sql变量赋值
  v_sql:='select job from emp where empno=:1 and ename=:2';
  --执行查询命令
  execute immediate v_sql into v_job using 7654,'MARTIN';
  dbms_output.put_line(v_job);

end;

你可能感兴趣的:(plsql基础)