gistfile1.txt /* Oracle PL/SQL-------------------------过程,函数,游标,触发器----------------------------存储过程 CREATE [OR REPLACE] PROCEDURE pname [ (param1 [mode1] type1, param2 [mode2] type2, …)] IS | AS BEGIN 执行代码
/* Oracle PL/SQL
-------------------------过程,函数,游标,触发器--------------------------
--存储过程
CREATE [OR REPLACE] PROCEDURE pname
[ (param1 [mode1] type1,
param2 [mode2] type2,
…)]
IS | AS
BEGIN
执行代码
END [pname]
pname:过程名称
param1、param2:形参名称
mode1、mode2:参数模式,包括IN(默认)、OUT、IN OUT
type1、type2:参数数据类型
SQL窗体执行存储过程:begin 存储过程名称 end
SQL命令窗体执行存储过程:exec 存储过程名称
查询所有过程:select * from user_objects where object_type='PROCEDURE'
特点:存储过程可以直接运行,可以返回多个值
------------------------------------------------------------------------
2.函数
CREATE [OR REPLACE] FUNCTION fname
[(param1 [mode1] type1,
param2 [mode2] type2,
)]
return type
IS | AS
BEGIN
执行代码块
END [fname]
注意:函数一定要有返回值
查询所有函数:select object_name from user_objects where object_type='FUNCTION';
------------------------------------------------------------------------
3.游标
------------------
SQL语句 游标
非查询语句 隐式的
结果是单行的查询语句 隐式的或显示的
结果是多行的查询语句 显示的
------------------
隐式游标属性:
SQL%FOUND – 语句影响了一行或多行时为 TRUE
SQL%NOTFOUND – 语句没有影响任何行时为TRUE
SQL%ROWCOUNT – 语句影响的行数
SQL%ISOPEN - 游标是否打开,始终为FALSE
------------------
显式游标
a.定义:
CURSOR cursor_name[(parameter[, parameter]…)]
[RETURN datatype]
IS
select_statement;
b.打开游标
OPEN cursor_name[([parameter =>] value[, [parameter =>] value]…)];
c.提取游标数据
FETCH cursor_name INTO {variable_list | record_variable };
d.关闭游标
CLOSE cursor_name;
案例1:查询前10名员工的信息。
DECLARE
CURSOR c_cursor
IS SELECT first_name || last_name, Salary
FROM EMPLOYEES
WHERE rownum<11;
v_ename EMPLOYEES.first_name%TYPE;
v_sal EMPLOYEES.Salary%TYPE;
BEGIN
OPEN c_cursor;
FETCH c_cursor INTO v_ename, v_sal;
WHILE c_cursor%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(v_ename||'---'||to_char(v_sal) );
FETCH c_cursor INTO v_ename, v_sal;
END LOOP;
CLOSE c_cursor;
END;
-------------------------
y-----------------------------------------------
3.触发器
CREATE OR REPLACE TRIGGER trigger_name
timing event1 ON table_name
[FOR EACH ROW]
DECLARE
BEGIN
--触发器代码
END;
--------------------------------------
tname:表示触发器名字
timing:表示触发时间 after before
event1:表示触发事件 insert,update,delete
table_name:表示针对的表
for each row:(默认是语句级)行级触发器(当一条SQL语句影响多行时,多行同时出发 触发器),DML语句处理每条记录都会执行触发器;否则是一个语句级的触发器,每个DML语句触发一次
------------------
功能 说明 举例
触发时间 触发器体执行的时机 before,after
触发事件 哪类具体的数据操纵语句 insert,update,delete
new old
查询所有触发器:select trigger_name from all_triggers where table_name='XXX';
------------------------------------------------------------------------
*/
