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 ; /
不断完善中