您当前的位置: 首页 > 

cuiyaonan2000

暂无认证

  • 0浏览

    0关注

    248博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

存储过程教程

cuiyaonan2000 发布时间:2013-01-24 10:06:41 ,浏览量:0

创建存储过程
CREATE OR REPLACE PROCEDURE cuiyaonan2000(存储过程名)
(
    参数1  IN  NUMBER,
    参数2  IN  NUMBER,
    参数3  OUT  Number  //如上是in表示你传递给存储过程的参数,out表示存储过程返回给你的参数.可以有多个.不同于下面的变量
) IS/AS  //这里用IS 还是用AS 随个人习惯,没有什么区别
变量1 INTEGER :=0;
变量2 DATE; //如上这些是变量是存储过程的内部变量,相当于在方法内申请的局部变量.当然有全局变量,在此不做介绍.作用就是在下面的语句块中使用,和方法内部变量一致.变量可以有多个.
BEGIN
这里是一些用if,while,for等流程语句控制的多个sql;
END cuiyaonan2000 //结束标志

用例环境oracle数据库 PL/SQL Developer

create or replace procedure cuiyaonan2000(a in number,b out number)IS
	first1 char;
	second2 number(1);
 	third3 number := 123;
	begin
 		NULL; 
 	EXCEPTION
 		WHEN NO_DATA_FOUND THEN
 			dbms_output.put_line('数据未找到错误');
		when others then 
			dbms_output.put_line('未知错误');
 	END;
end cuiyaonan2000;
//如上 := 是给变量赋值的 传统意义上的 等号 
//如上 := 是给变量赋值的 传统意义上的 等号
//如上exception when 就是 拦截异常 跟Try catch 一样
//No_data_found 是异常名 others指所有异常
// dbms_output.put_line 是数据库方法 如同system.out.println
// 可以设置变量,字符串与变量的连接使用||符号.比如 first1 = '我是字符串连接变量'||first1

 流程控制语句         IF流程语句:
      create or replace procedure cuiyaonan2000(a in number,b out number)IS
      	first1 char;
      	second2 number(1);
      	third3 number := 123;
    	begin
      		if a > 0 then
        			begin
           			dbms_output.put_line(a);
          			b:= 123;
           			dbms_output.put_line(a);
          		end;
       		end if;
       		if third3 > 0 then
         			begin
           			dbms_output.put_line(third3);
           			third3 := third3 +1;
           			dbms_output.put_line(third3);
           		end;
           	end if;
		exception
             		WHEN NO_DATA_FOUND THEN
     				dbms_output.put_line('数据未找到错误');
			when others then 
     				dbms_output.put_line('未知错误');
     	end cuiyaonan2000;
     	//如上的传入参数a 不能再赋值,否则报错
     	//如上 := 是给变量赋值的 传统意义上的 等号
   	//b 用来接收 cuiyaonan2000存储过程返回的结果.少参数调用报错
    //如上可以看多多个 begin与end的组合,每个begin与end都是一个相对独立的语句块,让逻辑更清楚
    // 关于exception ,都是存在于begin与end中的,并且exception位于后,即最后. 
    // 子的begin和end 的exception没有抓获的异常会抛给父类的begin和end所属的exception.以此类推

      FOR流程语句
	create or replace procedure cuiyaonan2000(a in number,b out number)IS
       		Cursor cursor is select name from test_table_user;
    		begin
			FOR temp IN cursor LOOP
    				dbms_output.put_line(temp.name);
			END LOOP;
		exception
  			WHEN NO_DATA_FOUND THEN
     				dbms_output.put_line('数据未找到错误');
  			when others then 
     				dbms_output.put_line('未知错误');
     	end cuiyaonan2000;
     //如上 cursor 是游标 跟jdbc的游标差不多 指向一条记录.然后用循环来遍历所有查到的记录.这里for temp in 后必须是记录集合
     

    WHILE流程语句
	create or replace procedure cuiyaonan2000(a in number,b out number)IS
         		c number :=1;
       		begin     
          		while c < 10 LOOP 
            			begin    
              				c:= c + 1;
             				dbms_output.put_line(c);

            			end; 
          		end LOOP;
          	exception
           		WHEN NO_DATA_FOUND THEN
               			dbms_output.put_line('数据未找到错误');
         			WHEN others then 
               			dbms_output.put_line('未知错误');
     	end cuiyaonan2000;
     
     

变量的声明与赋值使用 变量声明第一种

格式:变量名 数据类型(大小)

  • 设置为字符串类型时,需要指定大小,否则报错;   
  • 变量的声明必须在"begin"关键字之前进行。

例子

create or replace procedure cuiyaonan2000(a in number,b out number)IS
	first1 char;
	second2 number(1);
 	third3 number := 123;
	begin
 		select 字段A into first1 from dual;
        dbms_output.put_line('获取sql查询返回的值并赋值给变量');
 	EXCEPTION
 		WHEN NO_DATA_FOUND THEN
 			dbms_output.put_line('数据未找到错误');
		when others then 
			dbms_output.put_line('未知错误');
 	END;
end cuiyaonan2000;
//上的变量声明 前面已经用到了必须在begin前面
//后面两种介绍的 变量也是这样的 就不举例了

变量声明第二种

格式: 变量名 表名字段名%TYPE (该变量的数据类型与指定表的字段数据类型一致)

变量声明第三种

格式: 变量名 表名%ROWTYPE   (该变量是一个对象,属性为该表的所有字段,调用的时候使用  变量名.字段名  来调用)

变量赋值
  • := 这种赋值方式 适用于第一种变量申明和第二种变量申明(两者差不多)
  • select 字段1 into 变量名 from 表名  where id =1 适用于第一种和第二种,(且返回的记录数只能是一条)
  • select * into 变量名 from 表名 where id=1    适用于第三种.   (区别很明显  第三种是个集合,且只能有一条记录)

举例:

declare/* 存储过程,不需要声明 */
 v_sql varchar2(100);
 V_ORGSEQ varchar2(100);
begin
 v_sql := 'SELECT ORGSEQ FROM BASE_ORG_INFO where orgcode=to_char(410621101233)';
 --V_ORGSEQ赋值
 execute immediate v_sql INTO V_ORGSEQ;
 --打印结果
 DBMS_OUTPUT.put_line(V_ORGSEQ);
END;

这是些简单的用例,建议大家看完这些后再去研究下游标.如何调用存储过程可以在 plsql的sql命令中输入如下的代码

   //这里是 plsql sql窗口的测试写法
   //i 用来接收 cuiyaonan2000存储过程返回的结果.少参数也报错
declare 
  i integer;
begin
  cuiyaonan2000(1,i);
end;   

关注
打赏
1638267374
查看更多评论
立即登录/注册

微信扫码登录

0.5875s