储存过程,游标的使用

原创 2013年12月04日 22:52:47
--创建简单 存储过程
--or replace替换以前名字
create or replace procedure Thh_sdd
is
begin
  dbms_output.put_line('procedure');
end;
--执行存储过程
begin
  Thh_sdd;
end;
--创建带参数 的存储过程
create or replace procedure my_procedure
(eno in number default 3,ename_p in out nvarchar2 ) --default默认是3的值
is
begin
 select  ename into ename_p from emp where empno=7369; 
end;
--调试 my_procedure
declare 
ename nvarchar2(10);
eno number(1);
begin
  eno:=1;
  my_procedure(ename_p=>ename); -- 指定 形参 实参
  dbms_output.put_line(ename);
end;
--练习 动态 取值
declare  
empinfo emp%rowtype;
begin
  select * into empinfo  from emp where empno=7369;--sql语句 into 赋值
  dbms_output.put_line(empinfo.ename);
end;
--游标 使用
declare 
--定义游标变量,同时绑定查询语句
cursor cs is select * from emp;
empinfo emp%rowtype;
begin
  --打开游标
  open cs;
  loop
    --把抓取到的值放人到into的变量中去
    fetch  cs into empinfo;
    exit when cs%notfound;
    dbms_output.put_line(empinfo.ename);
  end loop;
  --关闭游标
  close cs;
end;
--游标赋值 变量
declare  
emp_name emp.ename%type;
cursor my_cursor is select ename from emp;
begin
  open my_cursor;
  loop
    fetch my_cursor into emp_name;--提取变量值
    exit when  my_cursor%notfound;
    dbms_output.put_line(emp_name);     
  end loop;
  close my_cursor;
end;
--带参数的游标 使用
declare  
emp_name emp.ename%type;
cursor my_cursor(dno number:=30) is select ename from emp where deptno=dno;--dno 参数
begin
  open my_cursor(&no); --接收 参数
  loop
    fetch my_cursor into emp_name;--提取变量值
    exit when  my_cursor%notfound;
    dbms_output.put_line(emp_name);     
  end loop;
  close my_cursor;
end;
--循环游标
begin
  --自动打开,自动抓取,自动判断终止,自动关闭
  for empinfo in (select * from emp where deptno=&no) loop
    dbms_output.put_line(empinfo.ename);
  end loop;
end;
--ref游标(弱类型动态游标)
declare 
type my_cursor is ref cursor; --创建 类型 type
cs  my_cursor;
mep_info emp%rowtype;
begin
  --动态 输入sql 语句
  open cs for select * from emp;
  loop
   fetch cs into mep_info;
   exit when cs%notfound;
   dbms_output.put_line(mep_info.ename); 
  end loop;
  close cs;
end;
--ref游标(强类型动态游标)
declare
type my_cursor is ref cursor return emp%rowtype; --有返回值类型 强制限定类型必须一样 
mep_info emp%rowtype;
cs my_cursor;
begin
  open cs for select * from emp;
  loop
   fetch cs into mep_info;
   exit when cs%notfound;
   dbms_output.put_line(mep_info.ename); 
  end loop;
  close cs;
end;


 --总结
 --cursor  游标的使用 
 --create procedure  创建存储过程
 --fetch cursor into table ;循环取值
 --loop  end loop;   exit when %notfound --判断还有数据没有
 --type cursor 创建类型游标 
 --如果不是循环游标就要手动打开,关闭游标
 --游标的强弱就是在 后面加不加 返回值类型
create or replace procedure my_dept (pno number ,epno out nvarchar2,saltu out nvarchar2 )
is
  empinfo emp%rowtype; 
begin
       epno:=select depno from emp where empno=pno;
     -- dbms_output.put_line('55'); 

end;




create or replace function addSal(sal number, crement number)
return number
as
begin
  return sal+crement;
end;


select addSal(sal, nvl(comm, 0)) from emp;


declare
  "sum" number(5);
begin
  dbms_output.put_line(addSal(1, 2));
  "sum" := addSal(5, 5);
  dbms_output.put_line('sum-------->' || "sum");
end;


--函数的权限控制
create user zs identified by aaa;
grant connect, resource to zs;
grant execute on scott.addsal to zs;


select scott.addSal(3, 6) from dual;


SELECT * from all_source where name='ADDSAL'


--自主事务
create or replace procedure testpd
is
   pragma autonomous_transaction;     --自主事务一定要显示结束
begin
   insert into emp(empno) values(8888);
   --rollback;
   update emp set ename='Tom' where empno=8000;
   commit;
end;
--测试结果
begin
  insert into emp(empno) values(8000);
  testpd;
  --只插人了数据没有更改名字
  rollback;
  dbms_output.put_line('执行完毕');
end;


select * from emp;


--简单触发器
create or replace trigger insertemp
after insert
on emp
--取别名字   before after 时间段区别 执行前触发 ,执行后触发
referencing new as inserted
for each row--循环每一行数据
begin
  dbms_output.put_line('新增了一条员工记录, 新员工编号为:' || :inserted.empno);
end;


insert into emp(empno, ename) values(5752, 'Jack');


--老板的工资不能少
create trigger checkSal
before update of sal
on emp
for each row
--在when中使用old new 就不用:
when (old.mgr is null)
begin
  if :new.sal<:old.sal then
    :new.sal := :old.sal;
  end if;
end;


update emp set sal=2900 where ename='JONES';


--自动利用序列填充主键
--创建序列器
create sequence empsq start with 9000;


create or replace trigger generationPK
before insert
on emp
for each row
begin
  --触发器不能直接使用DML语句,避免无限递归
  --insert into emp(empno) values(empsq.nexval);
  select empsq.nextval into :new.empno from dual;
end;


--测试 插人主键值
insert into emp(ename) values('Marry');


  declare
      result1 clob;
      xmlstr varchar(32767);
      strline varchar(2000);
      line_no number := 1;
  begin
      result1 := dbms_xmlquery.getXML('select * from emp');
      xmlstr := substr(result1,1,32767);
      loop
          exit when xmlstr is null;
          strline := substr(xmlstr,1,instr(xmlstr,chr(10))-1);
          dbms_output.put_line(line_no||':'||strline);
          xmlstr := substr(xmlstr,instr(xmlstr,chr(10))+1);
          line_no := line_no + 1;
      end loop;
  end;


版权声明:本文为博主原创文章,未经博主允许不得转载。

游标的使用方法

游标的学习 1. 声明游标就是为了定义一个游标名称来对应一条查询语句,然后对这个查询结果集进行单行操作 声明语句在单个使用的时候需要在declare子句中进行,在存储过程中便是...
  • newMyStyle
  • newMyStyle
  • 2016年01月14日 23:25
  • 2266

Sqlserver中存储过程和游标的一些使用例子

/*带输入输出参数存储过程*/ ALTER PROCEDURE pro_test2 @userID INT, @maxUserID INT OUTPUT, @countUser INT OUTP...
  • smartsmile2012
  • smartsmile2012
  • 2016年11月21日 14:34
  • 4532

mysql 储存过程游标的使用

book 表 book_log 表 创建储存过程 create procedure selectfunc() BEGIN declare no_mode int default 0; dec...
  • zhaanghao
  • zhaanghao
  • 2015年10月26日 17:11
  • 353

mybatis 调用存储过程 返回游标 实例

[sql] view plaincopy 存储过程示例:   create or replace procedure Fsp_Plan_CheckPrj(v_grantno  varchar2,...
  • e_wsq
  • e_wsq
  • 2015年12月31日 09:02
  • 1056

mysql中游标的运用

游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制;游标充当指针的作用;尽管游标能遍历结果中的所有行,但他一次只指向一行。...
  • u013030601
  • u013030601
  • 2016年12月27日 16:14
  • 3006

创建五种存储过程及游标的使用

--创建存储过程 --A. 创建使用参数的存储过程 CREATE PROC au_info  @lastname varchar(40),  @firstname varchar(20...
  • linlin2294592017
  • linlin2294592017
  • 2013年09月03日 11:00
  • 9153

存储过程中输出参数为游标的时候怎么处理

http://msdn.microsoft.com/zh-cn/library/ms175498(v=sql.90).aspx Transact-SQL 存储过程只能将 cursor...
  • zjlolife
  • zjlolife
  • 2013年07月01日 17:29
  • 1477

存储过程游标的详解

1,什么是游标?  ①从表中检索出结果集,从中每次指向一条记录进行交互的机制。      ②关系数据库中的操作是在完整的行集合上执行的。   由SELECT 语句返回的行集合包括满足该语句的W...
  • gogogo_zzz
  • gogogo_zzz
  • 2016年09月21日 15:29
  • 654

ORACLE PL/SQL语法应用:游标,存储过程,触发器,函数

--游标 --do while declare    cursor c is select * from t_t_student order by id;   v_record c%rowtype; ...
  • Eric_ley
  • Eric_ley
  • 2017年02月16日 17:46
  • 406

数据库——游标

以前也接触过游标,但是打心里说不是太理解,通过这次学习感觉理解深刻了很多,特此总结学习一下。           一,游标是什么?                   游标是一段私有的SQL 工作区,...
  • liujiahan629629
  • liujiahan629629
  • 2014年01月08日 22:40
  • 39656
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:储存过程,游标的使用
举报原因:
原因补充:

(最多只允许输入30个字)