/*
pl/sql
基本语法
记录类型
*/
/*
1.pl/sql基本的语法格式
2.记录类型 type ... is record(,,,);
3.流程控制
3.1条件判断(两种)
方式1:if ... then elsif then ... else ... end if;
方式2:case ... when ... then ... end;
3.2循环结构(三种)
方式1:loop ... exit when ... end loop;
方式2:while ... loop ... end loop;
方式3:for i in ... loop ... end loop;
3.3 goto 、exit
4.游标的使用(类似于java中的Iterator)
5.异常的处理(三种方式)
6.会写一个存储函数(有返回值)、存储过程(没有返回值)
7.会写一个触发器
*/
--
set serveroutput on
--
--DECLARE
--声明的变量、类型、游标
BEGIN
--程序的执行部分(类似于java中的main()方法)
dbms_output.put_line('hello world!');
--EXCEPTION
--针对begin块中出现的异常,提供处理的机制
--when .... then ...
--when .... then ...
END;
--最简单的pl/sql语句块
BEGIN
dbms_output.put_line('hello world!');
END;
--
DECLARE
--声明变量
v_sal NUMBER(10, 2);
BEGIN
--sql语句的操作:select ... into ... from ... where ...
SELECT salary INTO v_sal FROM employees WHERE employee_id = 100;
--打印
dbms_output.put_line(v_sal);
END;
--
DECLARE
--声明变量
v_sal NUMBER(10, 2);
v_email varchar2(40);
v_hire_date DATE;
BEGIN
--sql语句的操作:select ... into ... from ... where ...
SELECT salary, email, hire_date INTO v_sal, v_email, v_hire_date FROM employees WHERE employee_id = 100;
--打印
dbms_output.put_line(v_sal);
dbms_output.put_line(v_email);
dbms_output.put_line(v_hire_date);
dbms_output.put_line(v_sal || ',' || v_email || ',' || v_hire_date);
END;
--
DECLARE
--声明变量
v_sal NUMBER(10, 2);
v_email varchar2(40);
v_hire_date varchar2(40);
BEGIN
--sql语句的操作:select ... into ... from ... where ...
SELECT salary, email, to_char(hire_date, 'yyyy-mm-dd') INTO v_sal, v_email, v_hire_date FROM employees WHERE employee_id = 100;
--打印
dbms_output.put_line(v_sal);
dbms_output.put_line(v_email);
dbms_output.put_line(v_hire_date);
dbms_output.put_line(v_sal || ',' || v_email || ',' || v_hire_date);
END;
--
DECLARE
--声明变量
v_sal employees.salary%TYPE; -- 动态获取employees表中的salary列的数据类型
v_email employees.email%TYPE;
v_hire_date employees.hire_date%TYPE;
BEGIN
--sql语句的操作:select ... into ... from ... where ...
SELECT salary, email, hire_date INTO v_sal, v_email, v_hire_date FROM employees WHERE employee_id = 100;
--打印
dbms_output.put_line(v_sal);
dbms_output.put_line(v_email);
dbms_output.put_line(to_char(v_hire_date, 'yyyy-mm-dd'));
dbms_output.put_line(v_sal || ',' || v_email || ',' || to_char(v_hire_date, 'yyyy-mm-dd'));
END;
--
--使用记录类型
DECLARE
--声明一个记录类型
TYPE emp_record IS RECORD(
v_sal employees.salary%TYPE, -- 动态获取employees表中的salary列的数据类型
v_email employees.email%TYPE,
v_hire_date employees.hire_date%TYPE
);
--定义一个记录类型的成员变量
v_emp_record emp_record;
BEGIN
--sql语句的操作:select ... into ... from ... where ...
SELECT salary, email, hire_date INTO v_emp_record FROM employees WHERE employee_id = 100;
--打印
dbms_output.put_line(v_emp_record.v_sal);
dbms_output.put_line(v_emp_record.v_email);
dbms_output.put_line(to_char(v_emp_record.v_hire_date, 'yyyy-mm-dd'));
dbms_output.put_line(v_emp_record.v_sal || ',' || v_emp_record.v_email || ',' || to_char(v_emp_record.v_hire_date, 'yyyy-mm-dd'));
END;
--
DECLARE
--v_salary VARCHAR2(20); --这样写也正确
--v_salary employees.salary%TYPE; -- 动态获取employees表中的salary列的数据类型
v_salary NUMBER(10, 2);
BEGIN
SELECT salary INTO v_salary FROM employees WHERE employee_id = 100;
--打印
dbms_output.put_line(v_salary);
END;
--
DECLARE
--v_salary VARCHAR2(20); --这样写也正确
--v_salary employees.salary%TYPE; -- 动态获取employees表中的salary列的数据类型
v_salary NUMBER(10, 2) := 666.88; -- :=符号表示赋值
BEGIN
--SELECT salary INTO v_salary FROM employees WHERE employee_id = 999; --没有编号为999的员工,查不到该员工
--打印
dbms_output.put_line(v_salary);
END;
--
DECLARE
--变量、记录类型等的声明
--定义一个变量
v_salary NUMBER(8, 2) := 0.00; -- :=符号表示赋值
BEGIN
--程序的执行部分
SELECT salary INTO v_salary FROM employees WHERE employee_id = 123;
dbms_output.put_line('薪水为' || v_salary);
--EXCEPTION
--异常的处理
END;
--
DECLARE
--变量、记录类型等的声明
--定义一个变量
v_salary NUMBER(8, 2) := 0.00; -- :=符号表示赋值
v_lastname VARCHAR2(40); --也可以不赋值
v_email VARCHAR2(40) := 'test@163.com';
v_hiredate DATE := SYSDATE;
BEGIN
--程序的执行部分
SELECT salary, last_name, email, hire_date
INTO v_salary, v_lastname, v_email, v_hiredate
FROM employees WHERE employee_id = 123;
dbms_output.put_line('姓名为' || v_lastname || ' 薪水为' || v_salary || ' 邮箱为' || v_email || ' 入职日期为' || v_hiredate);
--EXCEPTION
--异常的处理
END;
--
DECLARE
--变量、记录类型等的声明
--声明一个记录类型
TYPE emp_record IS record(
v_salary NUMBER(8, 2) := 0.00, -- :=符号表示赋值
v_lastname VARCHAR2(40), --也可以不赋值
v_email VARCHAR2(40) := 'test@163.com',
v_hiredate DATE := SYSDATE
);
--声明一个记录类型的变量
v_emp_record emp_record;
BEGIN
--程序的执行部分
SELECT salary, last_name, email, hire_date
INTO v_emp_record
FROM employees WHERE employee_id = 123;
dbms_output.put_line('姓名为' || v_emp_record.v_lastname || ' 薪水为' || v_emp_record.v_salary || ' 邮箱为' || v_emp_record.v_email || ' 入职日期为' || v_emp_record.v_hiredate);
--EXCEPTION
--异常的处理
END;
--
DECLARE
--变量、记录类型等的声明
--声明一个记录类型
TYPE emp_record IS record(
v_salary NUMBER(8, 2) := 0.00, -- :=符号表示赋值
v_lastname VARCHAR2(40), --也可以不赋值
v_email VARCHAR2(40) := 'test@163.com',
v_hiredate DATE := SYSDATE
);
--声明一个记录类型的变量
v_emp_record emp_record;
BEGIN
--程序的执行部分
dbms_output.put_line('姓名为' || v_emp_record.v_lastname || ' 薪水为' || v_emp_record.v_salary || ' 邮箱为' || v_emp_record.v_email || ' 入职日期为' || v_emp_record.v_hiredate);
--EXCEPTION
--异常的处理
END;
--
DECLARE
--变量、记录类型等的声明
--声明一个记录类型
TYPE emp_record IS record(
v_salary NUMBER(10, 2) := 0.68, -- :=符号表示赋值
v_lastname VARCHAR2(40), --也可以不赋值
v_email VARCHAR2(40) := 'test@163.com',
v_hiredate DATE := SYSDATE
);
--声明一个记录类型的变量
v_emp_record emp_record;
BEGIN
--程序的执行部分
dbms_output.put_line('姓名为' || v_emp_record.v_lastname || ' 薪水为' || v_emp_record.v_salary || ' 邮箱为' || v_emp_record.v_email || ' 入职日期为' || v_emp_record.v_hiredate);
dbms_output.put_line('姓名为' || v_emp_record.v_lastname || '。');
--将number数字类型转换成字符串类型
dbms_output.put_line('第1种薪水为' || to_char(v_emp_record.v_salary, '999,999,999.999'));
dbms_output.put_line('第2种薪水为' || to_char(v_emp_record.v_salary, '000,999,999.999'));
dbms_output.put_line('第3种薪水为' || to_char(v_emp_record.v_salary, 'L000,999,999.999'));
dbms_output.put_line('第4种薪水为' || to_char(v_emp_record.v_salary, '$999,999,999.999'));
dbms_output.put_line('第5种薪水为' || to_char(v_emp_record.v_salary, '000,000,000.00'));
dbms_output.put_line('第6种薪水为' || to_char(v_emp_record.v_salary, '$000,000,000.00'));
dbms_output.put_line('第7种薪水为' || to_char(v_emp_record.v_salary, '$000000000.00'));
dbms_output.put_line('第8种薪水为' || to_char(v_emp_record.v_salary, '000000000.00'));
dbms_output.put_line('第9种薪水为' || to_char(v_emp_record.v_salary, '00.00'));
dbms_output.put_line('第10种薪水为' || to_char(v_emp_record.v_salary, '0.00'));
--EXCEPTION
--异常的处理
END;
--简单版
DECLARE
TYPE salary_record IS RECORD (
v_salary NUMBER(8, 2),
v_name varchar2(30)
);
v_salary_record salary_record;
BEGIN
v_salary_record.v_salary := 68900;
v_salary_record.v_name := '令狐冲';
dbms_output.put_line('姓名为' || v_salary_record.v_name || ' 薪水为' || v_salary_record.v_salary);
END;
--使用%ROWTYPE关键字
DECLARE
--定义一个记录类型
v_emp_record employees%ROWTYPE; --%ROWTYPE表示和employees表中的所有列的结构一样
BEGIN
--程序的执行部分
SELECT *
INTO v_emp_record
FROM employees WHERE employee_id = 123;
dbms_output.put_line('姓名为' || v_emp_record.last_name || ' 薪水为' || v_emp_record.salary || ' 邮箱为' || v_emp_record.email || ' 入职日期为' || v_emp_record.hire_date);
dbms_output.put_line('部门编号为' || v_emp_record.department_id);
--EXCEPTION
--异常的处理
END;
--使用变量
DECLARE
v_emp_record employees%ROWTYPE; --%ROWTYPE表示和employees表中的所有列的结构一样
v_emp_id NUMBER(10);
BEGIN
v_emp_id := 100; --给v_emp_id变量赋值(为变量赋值,赋值符号使用:=)
--程序的执行部分
SELECT *
INTO v_emp_record
FROM employees WHERE employee_id = v_emp_id; -- 使用v_emp_id变量
dbms_output.put_line('姓名为' || v_emp_record.last_name || ' 薪水为' || v_emp_record.salary || ' 邮箱为' || v_emp_record.email || ' 入职日期为' || v_emp_record.hire_date);
dbms_output.put_line('部门编号为' || v_emp_record.department_id);
--EXCEPTION
--异常的处理
END;
--
SELECT salary, employees.* FROM employees WHERE employee_id = 100;
--
DECLARE
v_emp_id NUMBER(10);
BEGIN
v_emp_id := 100;
--做更新操作
UPDATE employees
SET salary = salary + 500
WHERE employee_id = v_emp_id;
dbms_output.put_line('执行成功');
END;
/*
以下是以前的知识
*/
--
SELECT 5 + 5 AS MYRESULT,
DEPARTMENT_ID,
CASE DEPARTMENT_ID
WHEN 80 THEN
'true'
ELSE
'false'
END
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN (80, 90);
--
SELECT CASE 6 WHEN 6 THEN 'true' ELSE 'false' END FROM DUAL
--
SELECT 3 + 3 AS myresult, CASE 6 WHEN 6 THEN 'true' ELSE 'false' END FROM DUAL
--如下这种写法会报错,myresult标识符无效,只能在排序的时候使用别名
SELECT 3 + 3 AS myresult, CASE myresult WHEN 6 THEN 'true' ELSE 'false' END FROM DUAL
--排序的时候可以使用别名
SELECT salary sal FROM employees emp ORDER BY sal DESC
SELECT 0.6 FROM dual;
SELECT to_char(0.1,'fm9999990.9999') FROM dual;
SELECT to_char(0.1,'9999990.9999') FROM dual;