PL/SQL 是基于SQL 语言的一种扩展,是运行在Oracle服务器端的一种语句,以下给出PL/SQL 的基本使用方式
基本语法:
--数据类型
declare
type table_datatype is table of varchar2(50) index by binary_integer; --表类型
v_table table_datatype;
i_provider_id int ;
v_provider_name varchar(20);
v_provider_address varchar(20);
type record_datatype is record (
id int ,
name varchar(20),
address varchar(20)
);
v_record record_datatype ;
begin
v_table(0) := '张三';
v_table(1) := '李四';
v_table(2) := '王五';
dbms_output.put_line(v_table(0)||','||v_table(1)||','||v_table(2));
--select into 的 语法必须返回单行,否则会出现错误
select provider_id,provider_name,provider_address into i_provider_id,v_provider_name,v_provider_address from t_provider_info where provider_id=1;
dbms_output.put_line(i_provider_id||','||v_provider_name||','||v_provider_address);
--select into 给table类型的变量赋值
select provider_id,provider_name,provider_address into v_table(0),v_table(1),v_table(2) from t_provider_info where provider_id=1;
dbms_output.put_line('table:'||v_table(0)||','||v_table(1)||','||v_table(2));
v_record.id :=1;
v_record.name :='赵六';
v_record.address :='广州';
dbms_output.put_line(v_record.id||','|| v_record.name||','||v_record.address);
select provider_id,provider_name,provider_address into v_record from t_provider_info where provider_id=2;
dbms_output.put_line(v_record.id||','|| v_record.name||','||v_record.address);
--循环的语法 loop ,end loop exit when
declare
v_count int :=0 ;
begin
loop
v_count := v_count+1 ;
exit when v_count=5;
dbms_output.put_line('v_count:'||v_count);
end loop ;
end ;
--循环语法 when ,loop end loop;
declare
v_count int :=0;
begin
while v_count<>5 loop
dbms_output.put_line('while 循环:v_count:'||v_count);
v_count := v_count+1;
end loop ;
end ;
--循环语法 for loop end loop;
declare
v_count int :=0;
begin
for v_ount in 2..5 loop
dbms_output.put_line('for 循环:v_count:'||v_count);
v_count :=v_count+1 ;
end loop ;
end ;
-- if的语法
declare
v_count int := 6 ;
begin
if v_count=5 then
dbms_output.put_line('满足条件5:v_count:'||v_count);
elsif v_count=3 then
dbms_output.put_line('满足条件3:v_count:'||v_count);
else
dbms_output.put_line('不满足条件3、5:v_count:'||v_count);
end if ;
end ;
--case when 的语法
declare
v_count int :=2 ;
begin
case v_count
when 1 then
dbms_output.put_line('满足条件1:v_count:'||v_count);
when 2 then
dbms_output.put_line('满足条件2:v_count:'||v_count);
else
dbms_output.put_line('不满足条件1、2:v_count:'||v_count);
end case ;
end ;
--游标的使用 ,使用fetch的方式遍历游标,必须显示打开和关闭游标
declare
cursor c_cursor is select provider_id,provider_name,provider_address from t_provider_info ; --定义游标
i_provider_id int ;
v_provider_name varchar(20);
v_provider_address varchar(20);
begin
open c_cursor;--打开游标
loop
fetch c_cursor into i_provider_id,v_provider_name,v_provider_address;
dbms_output.put_line('游标的使用:'||i_provider_id||','||v_provider_name||','||v_provider_address);
exit when c_cursor%notfound ;
end loop ;
close c_cursor;
end ;
--使用for 循环的方式遍历游标 不需要显示打开后者关闭游标
declare
cursor c_cursor is select provider_id,provider_name,provider_address from t_provider_info ; --定义游标
c_row c_cursor%rowtype ; --定义一个游标变量
begin
for c_row in c_cursor loop
dbms_output.put_line('隐式游标的使用:v_provider_name'||c_row.provider_id);
end loop;
end ;
--调用有返回值的存储过程
declare
v_name varchar(20) ;
v_id int ;
begin
pro_provider_info(1,v_name,v_id);
dbms_output.put_line('v_name:'||v_name||',v_id:'||v_id);
end ;
end ;
/
过程、触发器 函数的语法:
存储过程:
create or replace procedure pro_provider_info(id in int,name out varchar2,r_id out int) as v_provider_name varchar(50) := '广州发展中心'; cursor c_cursor is select provider_id,provider_name,provider_address from t_provider_info where provider_id=id ; --定义一个游标行的变量 c_row c_cursor%rowtype ; provider_id t_provider_info.provider_id%type ; --type 用来避免硬编码的错失 begin --隐式调用 for c_row in c_cursor loop provider_id := c_row.provider_id ; --更新对应的ID 的值 if provider_id=id then update t_provider_info set provider_name=v_provider_name where provider_id=id; name := v_provider_name; r_id := id; commit ; end if ; end loop ; end ;
触发器:
--触发器
create or replace trigger tri_provider_info
after insert or update or delete on t_provider_info for each row
begin
declare
v_insert varchar(20) :='插入操作' ;
v_update varchar(20) :='更新操作' ;
v_delete varchar(20) :='删除操作' ;
begin
if inserting then
insert into t_log(oper_id,oper_name) values(t_global_seq.nextval,v_insert);
dbms_output.put_line('插入操作');
elsif updating then
--,:old.provider_id,:new.provider_id
insert into t_log(oper_id,oper_name) values(t_global_seq.nextval,v_update);
dbms_output.put_line('更新操作');
elsif deleting then
insert into t_log(oper_id,oper_name) values(t_global_seq.nextval,v_delete);
dbms_output.put_line('删除操作');
else
dbms_output.put_line('无法明确的操作');
end if ;
--commit ; 在触发器中不需要手动提交
end ;
end ;
/
不断完善中