pl sql整理

`show error;展示错误
执行方式
1、exec 过程名(参数);
2、call 过程名(参数);
create or replace procedure
变量 v_
常量 c_
游标 变量名_cursor
例外 e_

declear 声明
定义 、变量、常量、游标、复杂数据类型;
begin 
执行部分
exception 例外

(1)pl/sql块
declare
--定义变量
v_ename varchar2(5);
v_sal number(7,2);
begin   
--执行部分
  select ename,sal into v_ename,v_sal from emp where empno = &no;
  --在控制台显示
  dbms_output.put_line('用户名是:'||v_ename||',工资是:'||v_sal);
--异常处理  
exception
    when no_data_found then
      dbms_output.put_line('无此人、请重新输入');
end;
no_data_found找不到相关数据异常

创建过程
create procedure sp_pro(spName varchar2,newSal number)
is
begin
--执行部分,根据用户名去修改工资
update emp set sal = newSal where ename = spName;
end;
调用过程
exec sp_pro('SCOTT',4567);
java j 调用存储过程 call sp_pro('SCOTT',4567);

函数 函数返回只有一个值
案例---输入员工的姓名,返回该员工的年资
create function sp_fun(spName in varchar2)
return number is yearSal number(7,2);
begin
--执行部分
select sal*12+nvl(comm,0)*12 into yearSal from emp where ename = spName;
return yearSal;
end;

show erorr;看错误

掉用函数
var abd number;
call sp_fun('SCOTT') into:abd;


包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成。
--创建一个包sp_package 
--声明该包有一个过程sp_pro
--声明该包有一个函数sp_fun
create or replace package sp_package is
 procedure sp_pro(spName varchar2,newSal number);
 function sp_fun(spName in varchar2)return number;
end;

--给包sp_package 实现包体
创建包体
create or replace package body sp_package is
procedure sp_pro(spName varchar2,newSal number) is
begin
update emp set sal = newSal where ename = spName;
end;
function sp_fun(spName in varchar2)
return number is yearSal number(7,2);
begin
select sal*12+nvl(comm,0)*12 into yearSal from emp where ename = spName;
return yearSal;
end;
end;
/

v变量 c常量  
:= 等于
c_tax_rate number(3,2) := 0.03;赋值

触发器
触发器是指隐含的执行的存储过程
create trigger

v_ename emp.ename%type;
定义类型为emp表的ename类型

标识

复合类型-pl/sql记录
类似与高级语言中的结构体
--pl/sql记录实例
declare
--定义一个pl/sql记录类型 emp_record_type,类型包含三个数据分别是
--name,salary,title
type emp_record_type is record(name emp.ename%type,salary emp.sal%type,title emp.job%type);
--定义了一个sp_record 变量,这个变量的类型是emp_record_type 
sp_record emp_record_type;
begin
select ename,sal,job into sp_record
from emp where empno = 7788;
dbms_output.put_line('姓名是:'||sp_record.name||',工资是:'||sp_record.salary);
end;

pl/sql表实例
declare
--定义一个pl/sql表类型 sp_table_type,该类型是用于存放emp.ename%type
--index by binary_integer 表示下标是整数
type sp_table_type is table of emp.ename%type index by binary_integer;
--定义了一个sp_table 变量,这个变量的类型是sp_table_type,
sp_table sp_table_type,
begin
select ename into sp_table(0)
from emp where empno = 7788;
dbms_output.put_line('姓名是:'||sp_table(0));
end;

参照变量
游标变量(ref-cursor)
declare
--定义游标类型 sp_emp_cursor
type sp_emp_cursor is ref cursor;
--定义一个游标变量
test_cursor sp_emp_cursor;
--定义变量
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
--执行
--把test_cursor 和一个select 结合
open test_cursor for select ename,sal from emp where deptno = &no;
--循环取出
loop
fetch test_cursor into v_ename,v_sal;
--判断是否test_cursor为空
exit when test_cursor%notfound;
dbms_output.put_line(v_ename||v_sal);
end loop;
--关闭游标
close test_cursor;
end;
条件分支
if -- then
if -- then -- else
if -- then -- elsif --else
end if;
书写形式
if v_job = 'aa' then
--------------------
elsif v_job = 'bb' then
--------------------
else
------------------
end if;

循环语句
(1)
loop
end loop;
:= 表示赋值

向users表插入10条数据

create or replace precudure insertUser(name varchar2)
is
--定义 := 表示赋值
v_num number := 1;
begin
loop
insert into users values(v_num,name);
--判断是否要退出循环
exit when v_num = 10;
--自增
v_num:=v_num + 1;
end loop;
end;

(2)
while 循环
create or replace precudure insertUser2(name varchar2)
is
--定义 := 表示赋值
v_num number := 11;
begin
while v_num  <= 20 
loop
insert into users values(v_num,name);
--自增
v_num:=v_num + 1;
end loop;
end;

(3)
for 循环

go to <<end loop>>

null;什么都不做;继续执行


--创建一个包,在该包中,定义类型test_cursor,游标
create or replace package tespackage as
type test_cursor is ref cursor;
end tespackage;
--
pl/sql分页

create or replace procedure fenye
(tableName in varchar2,
Pagesize in number,--每页显示多少条
pageNow in number,第几页
myrows out number,--总记录数
myPageCount out number,--总页数
p_cursor out tespackage.test_cursor--返回的记录数(游标)
) is
--定义部分
--定义sql语句 字符串
v_sql varchar2(1000);
--定义两个整数
v_begin number := (pageNow -1)*Pagesize+1;
v_end number := pageNow * Pagesize;
begin
--执行部分
v_sql := 'select * from (select t1.*,rownum rn from ('||tableName||') t1 where rownum
<='||v_end||'
)where rm >= '||v_begin;
--把游标和sql关联
open p_cursor for v_sql;
--计算myrows和mypagecount
v_sql:='select count(*) from '||tableName;
--执行sql语句 ,并把返回的值,赋给myrows;
execute immediate v_sql into myrows;
--计算mypagecount
if mod(myrows,pageSize)=0 then
mypagecount:=myrows/pageSize;
else
mypagecount:=myrows/pageSize+1;
end if;
--关闭游标
close p_cursor;
end;

--例外处理
--视图
视图是一个虚拟表,其内容由查询定义。同真实的表一样,
视图包含一系列带有名称的列和行数据。
但是,视图并不在数据可中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成.

  function get_department_tbc(paln_type varchar) return varchar as
    type_name varchar(20);
  begin
    if  paln_type = 'W' then
select decode(paln_type, 'W', '境内外部培训','')
      into type_name
      from dual;
    return type_name;
 elsif paln_type = 'O'
        select decode(paln_type, 'O', '境外培训','')
into type_name
      from dual;
    return type_name;
     end if;
   end;
   
function get_department_tbc(paln_type varchar) return varchar as
    type_name varchar(20);
  begin
    select decode(paln_type, 'W', '境内外部培训','')
      into type_name
      from dual;
    return type_name;
  end;

--------->>>>>>>>>>>>>>>>>-------------
循环游标
 FUNCTION full_ug_name_split(o_id NUMBER,spid NUMBER) RETURN VARCHAR2 IS
      CURSOR c_path IS
        SELECT UG_NAME NAME
          FROM user_group
        CONNECT BY PRIOR d_parent_id = ID
         START WITH ID = o_id;
      v_path varchar2(4000);
      level_count number :=0;
    BEGIN
      v_path := '';

      FOR i IN c_path LOOP
        v_path := i.NAME || '/' || v_path;
      END LOOP;

      if spid = 1 then
          select substr(v_path,1,instr(v_path,'/',1,1)-1) into v_path from dual;
      elsif spid = 2 then
          select substr(v_path,instr(v_path,'/',1,1)+1,instr(v_path,'/',1,2)-instr(v_path,'/',1,1)-1) into v_path from dual;
      else
          select instr(v_path,'/',1,2) into level_count from dual;
          if level_count = 0 then
             v_path := '';
          else
             select substr(v_path,instr(v_path,'/',1,2)+1) into v_path from dual;
          end if;
      end if ;

      v_path := RTRIM(v_path, '/');

      RETURN(v_path);
    END;
---------------------->>>>>>>>>>>>>-------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值