:= 赋值
= 等于
以分号结尾
匿名块
declare 定义变量(必须在此定义 先写变量名后写类型)
begin 程序正式操作(SQL)
Exception 错误处理
end; 程序结束
/ 运行
set serveroutput on size 1000000
dbms_output.put_line(值);
另一种数据类型方法
id stdu.id%TYPE; -> id:变量名 stdu:表名 id:字段名
st stdu%ROWTYPE -> 定义为表中一行所有的类型,相当于一个结构体
-> 调用时为:st.id st.name st.year
-> select * into st from stdu where id='5' 如果取出纪录则st.id,st.name
-> 等就有确切的值
游标cursor
语法:
(一)定义游标
CURSOR cursor_name
[(parameter_name[IN] datatype [{:=|DEFAULT} value]
[,(parameter_name[IN] datatype [{:=|DEFAULT} value] ..] )]
[RETURN returntype] is select_statment;
cursor_name:游标的名字
parameter_name:游标的SELECT语句中的参数
datatype:参数的数据类型
value:参数的默认值
returntype:游标的返回类型
select_statment:游标打开时将要执行的select语句
(二)打开游标
OPEN cursor_name[(parameter_value[,parameter_value ..')]
(三)从游标中取出数据
FETCH cursor_name INTO {record_name|variable_name[,variable_name]};
record_name:能和游标的select语句返回的数据类型相匹配的纪录
variable_name:变量的名字
(四)游标FOR循环
FOR record_name IN (select_statement) LOOP
statements
END LOOP;
(五)参数
%ISOPEN
%ROWCOUNT
%FOUNT
%NOTFOUND
(六)WHERE CURRENT OF
在为了更新或删除游标选择的行而打开游标时,可在update或delete的where子句中使用
WHERE CURRENT OF cursor_name
1 定义 cursor cur is select * from table
2 打开 open cur
3 提取 fetch cur into st; -> 提取一条纪录赋给st
4 关闭 close cur;
游标的两个属性 %Found:有纪录 %NOT Found:无纪录
while cur %Found Loop
fetch cur into st;
End Loop;
包分为包头和包体(可以没有包头,一定有包体) 包体包括函数和过程
包头:create or replace package pack_name
is/as
function fun_name(参数)
return number;
end pack_name;
参数写法:参数名 in/out/inout类型 (in是输入参数)
function a(a in number(7), b out number(4))
调用时a(7, i); 注意:第二个参数不可以写数字,只能传变量
produce: 过程,没有返回值
包体:
create or replace package pack_name
body is/as
function fun_name() return number is/as
return number;
end pack_name;
定义数组
1 type 名1 is varry of 类型;
名2 名1; -> 名2为用时的数组名
赋初值 名2 名1 := 名1(值);
2 数组的大小:数组.count
判断值在数组中是否存在:数组.Exists(值) 有返回true,无返回false
把一个空元素加到集合的LASTH位置:数组.extend
把n个空元素加到集合的LASTH位置:数组.extend(n)
把元素i的第n个副本加到表的尾部:数组.extend(n,i)
返回集合当前最大元素数量:数组.LIMIT
删除整个表:数组.delete
删除值为n的元素:数组.delete(n)
嵌入块
DECLARE
PROCEDURE DO_NOTHING IS
BEGIN
NULL;
END;
BEGIN
BEGIN
DO_NOTHING;
END;
EXCEPTION
WHEN OTHERS THEN
BEGIN
NULL;
END;
END;
IF语句
IF experssion THEN
ELSEIF experssion
ELSE
END IF;
WHILE语句
WHILE experssion LOOP
END LOOP;
FOR语句
FOR counter IN [REVERSE] start_value .. end_value LOOP
END LOOP;
注意:使用REVERSE 循环执行过程会返回来,即从初值减到结束值
基本循环语句
LOOP
END LOOP;
EXIT语句
LOOP ......
IF ....
EXIT;
END IF;
END LOOP;
WHEN语句
WHEN EXCEPTION [OR exception] THEN
WHEN OTHER THEN
创建过程的语法
CREATE [OR REPLACE] PROCEDURE
procedure_name [(parameter[{IN|OUT|IN OUT}]
datatype [,(parameter[{IN|OUT|IN OUT}]
datatype
[AUTHID{CURRENT_USER|DESIGNER}]
{IS|AS} [declarations]
BEGIN
code
END;
AUTHID CURRENT_USER:利用调用权限执行该过程的一个关键字,利用权限也可以对数据库对象进行访问
AUTHID DESIGNER:利用用户的定义权限执行该过程的一个关键字;以用该权限也可以对数据库进行访问。
declaration:PL/SQL语言编写的过程代码