- 存储过程
-这里要区别一下函数和存储过程,之前我一直理解的是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类型,如果是字符类型,自然就会报错。
结尾:关于存储过程的调用我还是不清楚,希望有高人指点一下,也希望我的总结对大家有帮助。