欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PL/SQL的标准语法及使用示例

程序员文章站 2022-03-23 19:45:34
pl/sql(procedural language/sql) 是一种过程化语言,pl/sql是oracle的专用语言,它是对标准sql语言的扩展,它允许在其内部嵌套普通的sql语句,也可以定义变量...

pl/sql(procedural language/sql)

是一种过程化语言,pl/sql是oracle的专用语言,它是对标准sql语言的扩展,它允许在其内部嵌套普通的sql语句,也可以定义变量和控制程序的执行流程,这样就将sql语句的数据操纵和查询能力与pl/sql的过程处理能力结合在一起了

标准pl/sql块的语法格式:

[declare] --声明部分,可选

begin --执行部分,必须

[exception] --异常处理部分,可选

end

定义变量和常量

1.定义变量<变量名> <数据类型> [(长度):=<初始值>];//pl/sql的赋值符号为:=

2.定义常量<常量名> constant <数据类型>:=<常量值>;

基本数据类型

1.数值类型:常用的是number(m,n)m为总的位数,n为小数位数

2.字符类型:主要包括varchar2、char、long、nchar和nvarchar2等。这些类型的变量用来存储字符串或字符数据。

3.日期类型:date类型,共七个字节包括世纪、年、月、天、小时、分钟和秒

4.布尔类型:boolean,值有true、false或null

特殊类型:

1.%type

使用这个类型关键字可以声明一个与指定列名称相同的数据类型,它通常紧跟在指定列名后

例如:

在scott模式下,使用%type类型的变量输出emp表中编号为7369的员工姓名和职务信息

set serveroutput on

declare

var_ename emp.ename%type;

var_job emp.job%type;

begin

select ename,job into var_ename,var_job from emp where empno=7369;

dbms_output.put_line('编号为7369的员工姓名为:'||var_ename||',职位为'||var_job);

end;

/

2. record

record类型也称作“记录类型”,使用该类型的变量可以存储由多个列值组成的一行数据。在声明记录类型变量之前,首先需要定义记录类型,然后才可以声明记录类型的变量。记录类型是一种结构化的数据类型,它使用type语句进行定义,在记录类型的定义结构中包含成员变量及其数据类型

例如:

声明一个记录类型emp_type,然后使用该类型的变量存储emp表中编号为7369

员工的姓名、职务、工资信息,并输出这条记录信息。

declare

type emp_type is record(

var_ename emp.ename%type,

var_job emp.job%type,

var_sal emp.sal%type

);

emp_info emp_type;

begin

select ename,job,sal into emp_info from emp where empno=7369;

dbms_output.put_line('编号为7369员工姓名:'

||emp_info.var_ename||',职务:'||emp_info.var_job||

'工资是:'||emp_info.var_sal);

end;

3.%rowtype

%rowtype类型的变量结合了“%type类型”和record类型变量的优点,它可以根据数据表中行的结构定义一种特殊的数据类型,用来存储从数据表中检索到的一行数据

例如:

声明一个%rowtype类型的变量rowvar_emp,然后使用该变量存储emp表中的一行数据。

declare

rowvar_emp emp%rowtype;

begin

select * into rowvar_emp from emp where empno=7369;

dbms_output.put_line('编号为7369的员工姓名为:'||rowvar_emp.ename||

',雇佣日期为:'||rowvar_emp.hiredate||'工资为:'||rowvar_emp.sal);

end;

/

选择语句:

1.使用if...then语句比较两个字符串变量的长度,并输出比较结果。

declare

var_str1 varchar2(20);

var_str2 varchar2(20);

begin

var_str1:='hello';

var_str2:='oracle is good';

if length(var_str1) dbms_output.put_line('字符串"'||var_str1||'"的长度小于"'||var_str2||'"');

end if;

end;

/

2.通过if..else语句实现只有年龄大于等于65岁,才可以申请退休,否则程序会提示不可以

申请退休。

declare

age number:=15;

begin

if age>=65 then

dbms_output.put_line('您可以申请退休');

else

dbms_output.put_line('年龄不到,不能申请退休!');

end if;

end;

/

3.指定一个月份数值,然后使用if...then..elsif语句判断它所属的季节,并

输出季节信息,代码如下。

declare

month int:=4;

begin

if month>=1 and month<=3 then

dbms_output.put_line('春天');

elsif month>=4 and month<=6 then

dbms_output.put_line('夏日炎炎');

elsif month>=7 and month<=9 then

dbms_output.put_line('秋天');

else

dbms_output.put_line('冬天很冷');

end if;

end;

/

4.使用loop语句求前100个自然数的和,并输出到屏幕。

declare

i int:=0;

sum_i int:=0;

begin

loop

i:=i+1;

sum_i:=sum_i+i;

exit when i=100;//结束条件

end loop;

dbms_output.put_line('前100个自然数的和是:'||sum_i);

end;

/

5.使用while语句求前100个自然数的和,并输出到屏幕。

declare

i int:=0;

sum_i int:=0;

begin

while i<=99 loop//这个i<99是进入循环的条件

i:=i+1;

sum_i:=sum_i+i;

end loop;

dbms_output.put_line('前100个自然数的和是:'||sum_i);

end;

/

6.使用for语句求前100个自然数中偶数之和,并输出到屏幕。

declare

sum_i int:=0;

begin

for i in 1..100 loop

if mod(i,2)=0 then//这是求余函数

sum_i:=i+sum_i;

end if;

end loop;

dbms_output.put_line('前100个自然数的和是:'||sum_i);

end;

/

7.指定一个季度数值,然后使用case语句判断它所包含的月份信息并输出。

declare

season varchar2(20):='夏天';

begin

case season

when '春天' then

dbms_output.put_line('包含1、2、3月份');

when '夏天' then

dbms_output.put_line('包含4、5、6月份');

when '秋天' then

dbms_output.put_line('包含7、8、9月份');

when '冬天' then

dbms_output.put_line('包含10、11、12月份');

else

dbms_output.put_line('未知季节!');

end case;

end;

/

内置函数:

测试系统函数可以使用

select ***(函数) from dual;语句其中dual是体统临时表

ascii(c)函数 :a---97

chr(i)函数 : 97---a

concat(s1,s2):函数连接字符串,返回新字符串

initcap(s): 函数 将每个单词的首字母大写

abs(n):返回n的绝对值

add_months(d,i):返回日期d加上i个月之后的结果。其中,i为任意整数

last_day(d):返回包含日期d月份的最后一天

sysdate:系统当前时间

to_char(x[,format]):该函数实现将表达式转换为字符串,format表示字符串格式

to_date(s[,format[lan]]):该函数将字符串s转换成date类型,format表示字符串格式,lan表示所使用的语言

avg:平均值

count():行数

power(a,b)a的b次方

round(a,b):给a保留b为小数并四舍五入

pl/sql存储过程

存储过程是一种命名的pl/sql程序块

存储过程保存在中,因为是已经编译好的代码,所以在被调用时,其执行效率非常高

存储过程的参数种类:

1. in 输入参数(默认)

2. out 输出参数

3. in out 输入输出参数