Oracle学习总结(二)

  • 存储过程
    -这里要区别一下函数和存储过程,之前我一直理解的是c++里的函数就相当于sql语句中的存储过程,这样的表达不是很准确。在sql语句中,既有函数也有存储过程,使用的时候是有区别的:sql的函数返回值只有一个(跟c++相同),但是存储过程可以有多个返回值(用返回参数的个数控制)。存储过程中可以写select语句,insert语句等。具体格式如下:
--company表的某id对应money乘以0.02             
create or replace procedure compute(
                c_id in company.id%TYPE,
                money out company.m%TYPE,       
                )
                is 
                begin
                    select m*0.02 into money from company c where c.id=c_id;
                    DBMS_OUTPUT.put_line (money);
                end compute; 

注:
- 其中compute是存储过程名;
- or replace代表若同名存储过程存在,则替换掉旧的存储过程;
- 传递参数时,in代表按值传入,并且它不允许在存储过程中被重新赋值,out代表引用的方式传出,in out代表同时具备两种功能,省略默认为in;
- 变量的类型,可以指定为number或char等,也可以用%type——代表和某表中某字段的类型相同(如本例所示)
- 存储过程中的select语句必须有into,代表把查询的结果放入某变量中;
- DBMS_OUTPUT.put_line (out_para)
用来查看传出的参数,注意该语句必须在begin和end语句之间才能正确运行;

  • for循环的使用
  • 在做项目过程中,发现会常常用到对每一行数据进行相同的数据库操作,这样如果每次都人工修改id很麻烦,所以就查了一下,用for循环控制。还有一个好处,当该表的行数在变动时,仍旧可以使用原有的sql语句,有利于数据库的维护工作。
    例子如下:

create table test2
(
   n number
);
declare
i number;
max_row number;
begin
  select count(*) into max_row from company;
  for i in 1..max_row loop
    insert into test2 values(i);
   end loop;
end;

我们先定义了一个变量,用来存储company的行数,然后通过传递行号,对新表的每一行进行插入操作,即便company表发生变动,我们也无需修改sql。

  • 报错:无效数字
    -这时候要仔细检查一下,很可能是数据类型不匹配的问题。看是不是定义表的字段类型与实际插入或更新的数据类型不一致,比如保留两位小数的代码:
update 表名 set 列名=to_char(round(表名.列名,2),'FM9999999999999999.00');

前提是该列名是number类型,如果是字符类型,自然就会报错。

结尾:关于存储过程的调用我还是不清楚,希望有高人指点一下,也希望我的总结对大家有帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值