oracle 存储过程的基本语法及注意事项

oracle 存储过程的基本语法
1.基本结构
CREATE OR REPLACE PROCEDURE 存储过程名字
(
    参数1 IN NUMBER,
    参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN
END 存储过程名字

2.SELECT INTO STATEMENT
  将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
  记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
  例子:
  BEGIN
  SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
      xxxx;
  END;
  ...

3.IF 判断
  IF V_TEST=1 THEN
    BEGIN
       do something
    END;
  END IF;

4.while 循环
  WHILE V_TEST=1 LOOP
  BEGIN
 XXXX
  END;
  END LOOP;

5.变量赋值
  V_TEST := 123;

6.用for in 使用cursor
  ...
  IS
  CURSOR cur IS SELECT * FROM xxx;
  BEGIN
 FOR cur_result in cur LOOP
  BEGIN
   V_SUM :=cur_result.列名1+cur_result.列名2
  END;
 END LOOP;
  END;

7.带参数的cursor
  CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
  OPEN C_USER(变量值);
  LOOP
 FETCH C_USER INTO V_NAME;
 EXIT FETCH C_USER%NOTFOUND;
    do something
  END LOOP;
  CLOSE C_USER;

8.用pl/sql developer debug
  连接数据库后建立一个Test WINDOW
  在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试

 


关于oracle存储过程的若干问题备忘
1.在oracle中,数据表别名不能加as,如:

select a.appname from appinfo a;-- 正确
select a.appname from appinfo as a;-- 错误
 也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧

2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。

  select af.keynode into kn from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 有into,正确编译
  select af.keynode from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 没有into,编译报错,提示:Compilation
  Error: PLS-00428: an INTO clause is expected in this SELECT statement


3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。

   可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select...into...

4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错

 select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid;-- 正确运行
select af.keynode into kn from APPFOUNDATION af where af.appid=appid and af.foundationid=foundationid;-- 运行阶段报错,提示
ORA-01422:exact fetch returns more than requested number of rows
5.在存储过程中,关于出现null的问题

假设有一个表A,定义如下:
create table A(
id varchar2(50) primary key not null,
vcount number(8) not null,
bid varchar2(50) not null -- 外键
);如果在存储过程中,使用如下语句:
select sum(vcount) into fcount from A where bid='xxxxxx';如果A表中不存在bid="xxxxxx"的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:
if fcount is null then
    fcount:=0;
end if;这样就一切ok了。

1.1量子力学方法 1.1.1 CASTEP CASTEP由Cambridge大学Mike Payne教授发布,采用密度泛函理论、平面波赝势法(用平面波描述外层价电子,内层电子用赝势代替),进行第一性原理量子力学计算的程序。其中总能量包含动能、静电能和交换关联能三部分,各部分能量都可以表示成密度的函数。电子与电子相互作用的交换和相关效应采用局域密度近似(LDA)或广义密度近似(GGA),静电势只考虑作用在系统价电子的有效势(即赝势:Ultrasoft 或norm-conserving),电子波函数用平面波基组扩展(基组数由Ecut-off确定),电子状态方程采用数值求解(积分点数由FFT mesh确定),电子气的密度由分子轨道波函数构造,分子轨道波函数采用原子轨道的线性组合(LCAO)构成。计算总能量采用SCF迭代。CASTEP在计算分子、固体、表面、界面、掺杂、错位等方面非常有优势。 主要功能及特性:  支持 PBE、PBE0、HSE03、HSE06以及SCAN meta-GGA 等交换关联泛函;  能量计算:形成能、吸附能、缺陷形成能、内聚能、表面能等;  结构优化:力与应力的计算、几何驰豫(原子坐标、晶胞参数、键长、键角、)等;  过渡态:过渡态搜索等;  电子结构:能带、态密度(局域、分波)、声子谱、电荷密度、差分电荷密度、电子局域函数、电子轨道、扫描隧道显微镜STM模拟、共价键级、静电势(支持可视化)、静电荷(Mulliken、Hirshfeld)、功函数、自旋极化(共线、非共线)、支持旋轨耦合、费米面、支持利用On-the-fly 生成模守恒(normconserving)赝势,特别适用于计算磁性材料和包含f电子的元素;  介电性质:波恩有效电荷、静态介电常数张量、极化率张量;  力学性质:弹性力常数张量,体模量,剪切模量,杨氏模量,泊松比;热力学性质:声子态密度、色散谱、熵、焓、自由能、零点能、德拜温度、等容热容随温度的变化曲线;  光学性质:红外光谱、拉曼光谱5.0、核磁共振谱(NMR CASTEP,可用DFT+U)、电子能量损失谱4.4(旋轨耦合效应5.5)、X射线吸收谱4.4(旋轨耦合效应5.5)、光频介电常数虚(实)部、吸收系数、折射率、能量损失函数、光导率虚(实)部;  动力学计算:支持NVE、NVT、NPT以及NPH等系综,以及多种控温控压函数;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值