1.块
使用分号作为一句SQL 或者PLSQL语句的结束;块结构关键字(DECLARE, BEGIN,EXCEPTION 后面不跟分号;END后面需带分号;你可以把一句SQL语句写在一行上,但一般不建议这么做,因为代码不够漂亮;
DECLARE
v_variable VARCHAR2(5);
BEGIN
SELECT column_name
INTO v_variable
FROM table_name;
EXCEPTION
WHEN exception_name THEN
...
END;
2.变量
变量类型
变量 命名规范:V_ 全小写 可设置默认值
varchar(有长度) number/date(无长度)
表名.字段名%type exp_report_headers.exp_report_number%type
表名%rowtype(记录类型) exp_report_headers%type
变量%type (已声明变量)
常量 c_ 可设置默认值
全局变量 g_ 可设置默认值
异常 e_ 不可设置默认值 e_amont_error exception;
注:在写块,存储过程或者函数的时候不要随便使用commit
所有变量都在begin之前声明
在同一个块中,避免命名与数据库表中的字段名相同的变量
3.输出语句 DBMS_OUTPUT.PUT_LINE ();
4.输入语句 &p_
5.给变量赋值
1.声明变量时 直接赋默认值 declare v_number := 10;
2.声明变量后 在BEGIN中给变量赋值 declare v_number; begin v_number := 10;
3.声明变量后 用INTO 的方式赋值(SELECT INTO语句: 用于把从数据库查询出内容存入变量)
declare
v_hire_date empliyees.hire_date%type;
v_salary empliyees.salary%TEPE;
BEGIN
select hire_date,salary
into v_hire_date.v_salary
from empliyees
where empliyees_id = 100;
END;
6.who字段
PLSQL中insert:who字段 create_by - p_user_id
creation_date - sysdate
last_update_by - p_user_id
last_update_date - sysdate
PLSQL中update:who字段 last_update_by - p_user_id
last_update_date - sysdate
7.if
if...then
[ ]
elsif...then
[ ]
else
[ ]
end if;
与NULL有关
if [ ] is null then [ ] end if;
if [ ] is not null then [ ] end if;
8.循环
1 LOOP
statement;
EXIT [WHEN condition];
END LOOP;
2 WHILE [condition] LOOP
[ ];
[ ];
...
END LOOP
3. FOR 循环变量 IN [ ] LOOP [ ] END LOOP;
(c_...) 一个区间 复杂逻辑
FOR c_exp_report in (select * from exp_report_headers) LOOP
v_number := c_exp_report.exp_report_number;
END LOOP;
9.outer
begin
<<outer>>
declare
v_birthdate varchar2(30);
begin
declare
v_birthdate date;
begin
outer.v_birthdate := to_char(sysdate,
'YYYY-MM-DD');
end;
dbms_output.put_line(v_birthdate);
end;
end outer;
10.游标
游标的声明和变量的声明在同一位置,
先声明变量再声明游标。
c_游标名
for 循环变量(c_)
in [①区间1..3 ②查询sql(有数据)③游标(有数据)] loop
[];
end loop;
declare
cursor c_exp_reports is
select * from exp_report_headers [FOR UPDATE NOWAIT];
begin
for c_exp_report in c_exp_reports loop
dbms_output.put_line(c_exp_report.amount);
if c_exp_report.amount = 3000 then
exit;
end if;
end loop;
end;
游标参数:(游标参数命名:p_ ;类型:varchar2 number date)
cursor c_exp_reports(p_参数 参数类型) is [需要传参数的sql];
declare
cursor c_exp_reports1 (p_id number) is
select * from exp_report_headers erh
where erh.exp_id = p_id;
cursor c_exp_reports2 (p_last_name varchar2) is
select * from exp_report_headers erh
where erh.exp_last_name = p_last_name;
begin
for c_exp1 in c_exp_reports1(1 // c_exp1.exp_id) loop
for c_exp2 in c_exp_reports2(c_exp2.last_name) loop
11.例外处理:exp_report_pkg
1.异常定义 e_[] exception;
2.异常抛出 if [条件] then raise e_[]; end if;
3.异常的存储 exception when e_amout_error
then insert into 异常表 v_; end; 存储过程
4.异常的查询与处理 (第一列降序)
select * from sys_raise_app_errors order by 1 desc
异常:遇到异常时会跳出异常,并自动回滚。
1.内置异常 -NO_DATA_FOUND 没有数据
例:begin
select e.id from emp e;
exception
when no_date_found then
end;
–TOO_MANY_ROWS 多行数据
例:select e.id into v_id from exp_employ e;
–DUP_VAL_ON_INDEX 唯一索引异常
例:unique index employ_code
-other 其他未知的异常
2.自定义异常
12.存储过程:
create (or replace) procedure
存储过程名[insert_表名 update_表名 deldete_表名 check_表名]长度<=30
[p_ in, |可以有默认值
p_ in out, |varchar2 number date,
x_ out]
create or replace procedure check_vegetables(p_pork in number,
p_potatoes in number,
p_Tomatoes in number) is
v_total_amount number;
begin
v_total_amount := p_pork * 6 + p_potatoes * 3 + p_Tomatoes * 5;
dbms_output.put_line(v_total_amount);
end check_vegetables;
13. 函数:
定义: create (or replace) function 函数名(p_) return [] is begin end 函数名;
命名:get_exp_report_headers_id
参数:in varchar2 in number in date <=30
返回值: varchar2 number date
create or replace function get_date return date is
FunctionResult date;
begin
FunctionResult := to_date(to_char(sysdate, 'YYYY-MM-DD'), 'YYYY-MM-DD');
return(FunctionResult);
end get_date;
14.包:package |包头 |包体
存储过程必须在包头包体同时声明,
函数可以不用声明包头|声明 公有函数
|不声明包头 私有函数
create [] procedure ; 包头
create [] procedure is []; 包体
create [] function () return []; 包头
create [] function () return [] is []; 包体
命名: |包头 exp_employ_pkg
|包体 exp_report_pkg body
记录表、记录类型
网友评论