--常用数据类型
VARCHAR2--文本
NUMBER--数字、金额
DATE--日期
VARCHAR2(1)--标记类字段
VARCHAR2(30)--编码类字段
VARCHAR2(200)--描述类字段
VARCHAR2(2000)--备注类字段
--insert 一定要写处理的字段,不要不写全表插入
insert into cux_employee(employee_id,employee_no,....)
values(cux_employee_s.nextval,xxx,......);
--序列 表名_s
create sequence cux_employee_s;
--who 字段
created_by number --创建人
creation_date date --创建日期
last_updated_by number --最后更新人
last_update_date date --最后更新日期
--主键 表名_PK
--唯一性索引 表名_U1..n
--索引 表名_N1..n
--块
declare--声明
begin--程序体开始
exception--异常处理
end;--程序体结束
DECLARE
v_att1 NUMBER; --局部变量 v_变量名
v_att2 NUMBER;
v_result NUMBER;
BEGIN
v_att1 := 100; --:= 赋值
v_att2 := 0;
v_result := v_att1 / v_att2;
dbms_output.put_line(v_result);
EXCEPTION
WHEN zero_divide THEN
dbms_output.put_line('除数为0!');
WHEN OTHERS THEN
dbms_output.put_line('error!');
END;
--常见预定义异常
DUP_VAL_ON_INDEX 唯一索引对应的列上有重复的值
NO_DATA_FOUND 使用 select into 未返回行,或应用索引表未初始化的元素时
TOO_MANY_ROWS 执行 select into 时,结果集超过一行
ZERO_DIVIDE 除数为 0
--select into 取表中某一行数据做取值
--NO_DATA_FOUND 使用 select into 未返回行,或应用索引表未初始化的元素时
--TOO_MANY_ROWS 执行 select into 时,结果集超过一行
DECLARE
v_employee_no VARCHAR2(30);
v_employee_name cux_employee.employee_name%TYPE;
BEGIN
SELECT e.employee_no,
e.employee_name
INTO v_employee_no,
v_employee_name
FROM cux_employee e
WHERE e.employee_id = 4;
dbms_output.put_line(v_employee_no || '/' || v_employee_name);
END;
--if & 自定义异常
DECLARE
v_num NUMBER;
e_error1 EXCEPTION; --申明自定义异常
e_error2 EXCEPTION;
e_error3 EXCEPTION;
BEGIN
v_num := 2;
IF v_num = 1 THEN
RAISE e_error1; --抛出自定义异常
ELSIF v_num = 2 THEN
RAISE e_error2;
ELSE
RAISE e_error3;
END IF;
EXCEPTION
WHEN e_error1 THEN--捕获自定义异常处理
dbms_output.put_line('error1');
WHEN e_error2 THEN
dbms_output.put_line('error2');
WHEN e_error3 THEN
dbms_output.put_line('error3');
WHEN OTHERS THEN
dbms_output.put_line('others');
END;
--for 遍历数据
--循环固定次数、范围
DECLARE
v_start NUMBER;
v_end NUMBER;
BEGIN
v_start := 0;
v_end := 9;
FOR cr IN v_start .. v_end
LOOP
dbms_output.put_line(cr);
END LOOP;
END;
--遍历结果集
DECLARE
v_num NUMBER;
BEGIN
v_num := 11;
FOR cr IN (SELECT employee_no,
employee_name
FROM cux_employee
WHERE rownum < v_num)
LOOP
dbms_output.put_line(cr.employee_no || cr.employee_name);
END LOOP;
END;
--view 视图
--创建 或 覆盖 对象类型 对象名称_v as
create or replace view cux_employee_v as
SELECT employee_no,
employee_name
FROM cux_employee
WHERE rownum < 10
select * from cux_employee_v;
--function 函数
--创建 或 覆盖 对象类型 对象名称(参数1 数据类型,参数2 数据类型,........)返回 数据类型 as
--传入参数 p_参数名
CREATE OR REPLACE FUNCTION test_fun(p_employee_id NUMBER) RETURN VARCHAR2 AS
--DECLARE
v_employee_no VARCHAR2(30);
v_employee_name cux_employee.employee_name%TYPE;
v_result VARCHAR2(200);
BEGIN
SELECT e.employee_no,
e.employee_name
INTO v_employee_no,
v_employee_name
FROM cux_employee e
WHERE e.employee_id = p_employee_id;
v_result := v_employee_no || v_employee_name;
--dbms_output.put_line(v_employee_no || '/' || v_employee_name);
RETURN v_result;
END;
DECLARE
v_employee_info VARCHAR2(200);
BEGIN
v_employee_info := test_fun(p_employee_id => 5);
dbms_output.put_line(v_employee_info);
END;
SELECT test_fun(p_employee_id => e.employee_id) employee_info,
e.*
FROM cux_employee e;
--procedre 存储过程
--创建 或 覆盖 对象类型 对象名称(参数1 传入/传出 数据类型,参数2 传入/传出 数据类型,........) as
--传入参数 p_参数名
--传出参数 o_参数名
--传入传出参数 x_参数名
CREATE OR REPLACE PROCEDURE test_proc(p_employee_id NUMBER,
o_employee_no OUT VARCHAR2,
o_employee_name OUT VARCHAR2) AS
--DECLARE
BEGIN
SELECT e.employee_no,
e.employee_name
INTO o_employee_no,
o_employee_name
FROM cux_employee e
WHERE e.employee_id = p_employee_id;
END;
DECLARE
v_employee_no VARCHAR2(30);
v_employee_name VARCHAR2(200);
BEGIN
test_proc(p_employee_id => 5, o_employee_no => v_employee_no, o_employee_name => v_employee_name);
dbms_output.put_line(v_employee_no || v_employee_name);
END;
--package
--package 包头 申明公共对象
--创建 或 覆盖 对象类型 对象名_pkg as
CREATE OR REPLACE PACKAGE test_pkg AS
FUNCTION test_fun(p_employee_id NUMBER) RETURN VARCHAR2;
PROCEDURE test_proc(p_employee_id NUMBER,
o_employee_no OUT VARCHAR2,
o_employee_name OUT VARCHAR2);
END test_pkg;
--package body 包体 具体的程序
--创建 或 覆盖 对象类型 对象名_pkg as
CREATE OR REPLACE PACKAGE BODY test_pkg AS
FUNCTION test_fun(p_employee_id NUMBER) RETURN VARCHAR2 AS
--DECLARE
v_employee_no VARCHAR2(30);
v_employee_name cux_employee.employee_name%TYPE;
v_result VARCHAR2(200);
BEGIN
SELECT e.employee_no,
e.employee_name
INTO v_employee_no,
v_employee_name
FROM cux_employee e
WHERE e.employee_id = p_employee_id;
v_result := v_employee_no || v_employee_name;
--dbms_output.put_line(v_employee_no || '/' || v_employee_name);
RETURN v_result;
END;
PROCEDURE test_proc(p_employee_id NUMBER,
o_employee_no OUT VARCHAR2,
o_employee_name OUT VARCHAR2) AS
--DECLARE
BEGIN
SELECT e.employee_no,
e.employee_name
INTO o_employee_no,
o_employee_name
FROM cux_employee e
WHERE e.employee_id = p_employee_id;
END;
END;
DECLARE
v_employee_info VARCHAR2(200);
BEGIN
v_employee_info := test_pkg.test_fun(p_employee_id => 5);
dbms_output.put_line(v_employee_info);
END;