关于字符串与变量拼接问题:
" ' || 变量 || ' " //变量转字符串
"常量" //常量转字符串
关于变量赋值问题:
:= //表示给变量赋值
if-else语句形式:
if x>80 and x<100 then
dbms_output.put_line(x||'优秀');
elsif x>60 and x<80 then
dbms_output.put_line(x||'及格');
else
dbms_output.put_line(x||'不及格');
end if;
case-when语句形式:
case
when 条件1 then
表达式1
when 条件2 then
表达式2
else
表达式3
end;
loop循环语句形式:
loop
循环体内容
end loop;
while循环语句形式:
while 条件
loop
循环体内容
end loop;
for循环语句形式:
for 变量 in [reverse] 初始值..终值 //[]内为可选值,reverse表示递减,for循环默认是递增,即从初始值递增到终值
loop
循环体内容
end loop;
执行控制台输出:
dbms_output.put_line(x); //控制台输出X
变量声明一般形式:
/*一般形式:用于存储过程或普通SQL表达*/
declare
变量名 数据类型;//第一种变量形式
变量名 表名.字段名%type; //第二种变量声明形式,表示此变量与该对应字段属同一类型,可存储该字段值
变量名 表名%rowtype; //第三种变量声明形式,表示此变量存储该表一条记录的各个字段的值
函数中变量声明:
AS
变量名 数据类型[长度]; //[]内为可选值,变量声明跟在AS/IS后面
存储过程中变量声明:
关于函数的定义:
函数模板:
create or replace function completed(tablename in varchar2)return number //function后跟函数名,小括号内为参数,in是模式表示此参数为输入参数,变量形式为变量名-in/out-数据类型这样的形式,如果没有参数,则无需带小括号,最后面return跟返回的数据类型
as //固定
nums number; //变量声明,也可以赋值,若赋值则格式为 变量名 数据类型 :=值
temp varchar2(1000); // 变量声明
begin //固定,表示函数内容的开始
temp:='select count(*) from "' || tablename || '"'; //函数体内容
execute immediate temp into nums; //execute immediate为固定搭配,用来执行SQL形式的字符串,如果有返回结果的可存入到一个变量中保存
return nums; //返回值
end; //固定,表示结束
关于存储过程的定义:
关于游标的定义:
创建显式游标:
/*带参数*/
CURSOR 游标名 (参数1 数据类型,......)
IS
SELECT语句;
/*不带参数*/
CURSOR 游标名
IS
SELECT语句;
打开显示游标:
在可执行部分,按以下格式打开游标:
OPEN 游标名(参数1,.....) --存在参数
或者
OPEN 游标名 --不存在参数
打开游标时,SELECT语句的查询结果就被传送到了游标工作区。
提取游标数据:
FETCH 游标名 INTO 变量;
游标打开后有一个指针指向数据区,FETCH语句一次返回指针所指的一行数据,要返回多行需重复
执行,可以使用循环语句来实现。控制循环可以通过判断游标的属性来进行。
取游标数据变量定义
1.单个变量:记录单个字段数据,变量名是用来从游标中接收数据的变量,需要事先定义。变量的个数和类型应与SELECT语句中
的字段变量的个数和类型一致。
2.行变量:记录一条数据,一次将一行数据取到记录变量中,需要使用%ROWTYPE事先定义记录变量,这种形式使用起来比较方便,不必分别定义和使用多个变量。
定义方式采用上面变量声明c:
变量名 表名|游标名%ROWTYPE;
关闭游标:
close 游标名; //游标关闭后,资源也被释放,重新使用时需要重新打开游标
游标属性:(可通过游标属性来查看状态和结果):
//需要执行fetch取到一行数据后以下变量值才会为true
sql%found (布尔类型,默认值为null)显式游标需要将SQL替换成游标名
sql%notfound(布尔类型,默认值为null)显式游标需要将SQL替换成游标名
sql%rowcount(数值类型默认值为0)显式游标需要将SQL替换成游标名
sql%isopen(布尔类型)显式游标需要将SQL替换成游标名
for循环配合游标使用:
declare
cursor hht is select *from student; //创建游标变量
begin
for yb in hht //这里不需要声明变量yb
loop
dbms_output.put_line(yb.ID||yb.STUDENT_NAME||yb.BIRTHDAY||yb.SEX);
end loop;
end;
while循环配合游标使用:
declare
cursor hht is select *from student; //创建游标变量
yb hht%rowtype; //创建存储每条结果集的变量
begin
open hht;//打开游标
fetch hht into yb; //取游标中一行数据到变量yb
while hht%found //如果当前游标存在数据
loop
dbms_output.put_line(yb.ID||yb.STUDENT_NAME||yb.BIRTHDAY||yb.SEX);
end loop;
close hht;//关闭游标
end;
存储过程创建模板:
create or replace procedure completed(tablename in varchar2)
as
nums number;
temp varchar2(1000);
begin
temp:='select count(*) from "' || tablename || '"';
execute immediate temp into nums;
return nums;
end;
存储过程的调用:
第一种:在begin体中使用 存储过程名(参数);调用
第二种:使用call 存储过程名(参数);调用
存储过程与函数的区别:
1).函数(function)总是向调用者返回数据,并且一般只返回一个值;2).存储过程(procedure)不直接返回数据,但可以改变输出参数的值,这可以近似看作能返回值,且存储过程输出参数的值个数没有限制。
从一般应用上来看,如果不需要返回值或者需要多个返回值,使用存储过程,如果只用一个返回值,就使用函数。
2、function定义中只能有DDL(如select等)语句;procedure中主要是DML语句(对数据库进行复杂操作时,如对多个表进行Update、Insert、Query、Delete时)。 如果想要使用select的结果集,则要使用游标