PLSQL基本语法

  • 格式:pdf
  • 大小:556.59 KB
  • 文档页数:8

PLSQL基本语法

作者:gqk:

1,什么是plsql:

 是专⽤于Oracle服务器,在SQL基础之上,添加了⼀些过程化控制语句,叫PLSQL过程化包括有:类型定义,判断,循环,游标,异常

或例外处理。。。

PLSQL强调过程

2,Plsql语句块:

 PL/SQL程序都是以块(block)为基本单位,整个PL/SQL块分三部分:

声明部分(⽤declare开头)

执⾏部分(以 begin开头)其中执⾏部分是必须的,其他两个部分可选

部分(以exception开头)

结束:end

--基本输出语句:

BEGIN

dbms_output.put_line('hello,world');

END;

--基本输出语句

BEGIN

dbms_output.put_line('hello,world');

dbms_output.put_line(157);

dbms_output.put_line(sysdate);

dbms_output.put_line(true);--不能传⼊布尔值

END;

3,Plsql语句块分类: 

匿名块:动态构造只执⾏⼀次(main)⼦程序:存储在数据库中的存储过程,函数及包等。当在数据库建⽴好后可以在其他⼦程序中调⽤

触发器:当数据库发⽣操作时,会触发⼀些事件,从⽽⾃动执⾏相应的程序

4,Plsql中的变量类型:

5,变量的使⽤:

plsql中声明和执⾏部分要严格分开,在java中时先声明后写变量plsql中相反 先声明在写

数据类型:

变量在声明后没有赋值输出结果为空:

变量的声明和初始化:(boolean中只能声明不能输出)

DECLARE

i NUMBER(4) := 157;

j NUMBER(6);

c VARCHAR2(200) := 'HELLO,WORLD';

d DATE := sysdate;

b BOOLEAN := TRUE;

BEGIN

j := 1000;--只能写在执⾏部分

dbms_output.put_line('i=' || i);

dbms_output.put_line('j=' || j);

dbms_output.put_line('c=' || c);

dbms_output.put_line('d=' || d);

END; 

在声明快中对常量的声明: 变量名称 【constant】 type 【not null】 【:value】

DECLARE

c CONSTANT NUMBER(4) := 100;

c2 NUMBER(4) NOT NULL := 101;

BEGIN

--c := 101; --常量不能重复赋值

dbms_output.put_line('c=' || c);

dbms_output.put_line('c2=' || c2);

END;

 --空语句 NULL 执⾏语句中必须写东西

DECLARE

c CONSTANT NUMBER(4) := 100;

c2 NUMBER(4) NOT NULL := 101;

BEGIN

NULL;--空语句,作为占位符使⽤

END;

 6,PLSQL中使⽤sql:

 --更新100员⼯,⼯资增加1块钱 :(不能再执⾏块中直接输出select语句)声明变量:员⼯的编号

声明变量:⼯资追加的钱数

DECLARE

v_empid BINARY_INTEGER := 100;

v_money BINARY_INTEGER := 1;

BEGIN

UPDATE employees SET salary=salary+v_money

WHERE employee_id=v_empid;

COMMIT;

END;

PLSQL中使⽤SQL语句的⼏种情况:

DML或DCL语句:直接执⾏ 

查询语句:SELECT...INTO 或者 游标

DDL语句:动态SQL执⾏ 

 7,SELECT...INTO...的使⽤:

语法:SELECT 列1,列2,…… INTO 变量1,变量2,……

--查询某个员⼯编号的姓名和⼯资:员⼯编号姓名

⼯资

列和变量的顺序,个数必须保持⼀致(如果没有数据则会抛出异常,返回的结果超过⼀⾏ 也会有异常)

DECLARE

v_empid BINARY_INTEGER := 101;

v_name VARCHAR2(50);

v_salary NUMBER(8,2);

BEGIN

SELECT last_name,salary

INTO v_name,v_salary

FROM employees

WHERE employee_id=v_empid;

dbms_output.put_line(v_empid || ',' || v_name || ',' || v_salary);

END;

--查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号:(以上思路 我们需要声明多个变量)

DECLARE

v_empid BINARY_INTEGER := 101;

v_name VARCHAR2(50);

v_salary NUMBER(8,2);

v_hiredate DATE; v_deptid BINARY_INTEGER;

BEGIN

SELECT last_name,salary,hire_date,department_id

INTO v_name,v_salary,v_hiredate,v_deptid

FROM employees

WHERE employee_id=v_empid;

dbms_output.put_line(v_empid || ',' || v_name || ','

|| v_salary || ',' || v_hiredate || ',' || v_deptid);

END;

java中处理多个数据我们可以封装为对象:

plsql中可以声明记录类型:时把逻辑相关的数据作为⼀个单元存储起来:

--记录类型record

--查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号

DECLARE

TYPE emp_record_type IS RECORD (

empid BINARY_INTEGER := 102,

ename VARCHAR2(50),

salary NUMBER(8,2),

hiredate DATE,

deptid BINARY_INTEGER

);

e emp_record_type;

BEGIN

SELECT employee_id,last_name,salary,hire_date,department_id

INTO e

FROM employees

WHERE employee_id=e.empid;

dbms_output.put_line(e.empid);

dbms_output.put_line(e.ename);

dbms_output.put_line(e.salary);

dbms_output.put_line(e.hiredate);

dbms_output.put_line(e.deptid);

END;

 --参照引⽤类型:参照已有的数据类型

--参照引⽤类型

--参照引⽤变量类型:变量名称%TYPE

--参照引⽤表中的列类型:表名.列名%TYPE

--参照引⽤表的记录类型:表名%ROWTYPE

 demo:

DECLARE

i NUMBER(4);

j i%TYPE := 100;--参照i的类型

k employees.employee_id%TYPE := 101;--参照员⼯表中员⼯编号的数据类型

BEGIN

dbms_output.put_line('j=' || j);

dbms_output.put_line('k=' || k);

END;

--查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号(参照类型)DECLARE

TYPE emp_record_type IS RECORD (

empid employees.employee_id%TYPE := 102,

ename employees.last_name%TYPE,

salary employees.salary%TYPE,

hiredate employees.hire_date%TYPE,

deptid employees.department_id%TYPE

);

e emp_record_type;

BEGIN

SELECT employee_id,last_name,salary,hire_date,department_id

INTO e

FROM employees

WHERE employee_id=e.empid;

dbms_output.put_line(e.empid);

dbms_output.put_line(e.ename);

dbms_output.put_line(e.salary);

dbms_output.put_line(e.hiredate);

dbms_output.put_line(e.deptid);

END;

 --查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号(参照引⽤表的记录类型)

DECLARE

e employees%ROWTYPE;

BEGIN

e.employee_id := 103;

SELECT *

INTO e

FROM employees

WHERE employee_id=e.employee_id;

dbms_output.put_line(e.employee_id);

dbms_output.put_line(e.last_name);

dbms_output.put_line(e.salary);

dbms_output.put_line(to_char(e.hire_date,'yyyy-mm-dd'));

dbms_output.put_line(e.department_id);

END;

--PLSQL表类型 

/*

TYPE ⾃定义类型名称 IS TABLE OF 元素类型

INDEX BY BINARY_INTEGER;

*/

DECLARE

TYPE name_table_type IS TABLE OF VARCHAR2(50)

INDEX BY BINARY_INTEGER;

n name_table_type;

BEGIN

n(-7) := 'tom';

n(4) := 'jack';

n(9) := 'rose';

dbms_output.put_line('元素的长度:' || n.count);

dbms_output.put_line(n(4));

END;

--表类型的常⽤属性

DECLARE

TYPE name_table_type IS TABLE OF VARCHAR2(50)

INDEX BY BINARY_INTEGER;

n name_table_type;

BEGIN

--设置元素

n(-5) := 'tom';

n(3) := 'jack';

n(17) := 'rose';

n(23) := 'zhang';

n(24) := 'wangwu';