欢迎投稿

今日深度:

项目中oracle存储过程记录——常用语法备忘,o

项目中oracle存储过程记录——常用语法备忘,oracle存储过程


项目中oracle存储过程记录——常用语法备忘

 

项目中需要写一个oracle存储过程,需求是收集一个复杂查询的内容(涉及到多张表),然后把符合条件的记录插入到目标表中。其中原表之一的日期字段是timestamp类型,目标表的字段是varchar2类型;

       其中一些内容很常用,所以做下记录,供查找。

1、存储过程的格式

       oracle存储过程和函数都可以实现,一般没有返回值,则采用存储过程,函数比sqlserver的功能强大。oracle变量定义最好加上前缀如V_,查询条件中变量名称和字段名称不能重复。

CREATEOR REPLACE PROCEDURE PROC_NAME (

  v_interval IN NUMBER DEFAULT -3 –PARAM_NAME_LIST

)AS

  v_cnt            number(4); -- 定义变量及游标

BEGIN

--业务逻辑语句

ENDPROC_NAME

 

2、游标定义和循环

cursor  CURSOR_NAME is

              SELECT * FROM DUAL – SELECT 语句;

循环游标有多种方式,最简单的for方式,避免定义一些变量及打开、关闭游标,可以简化很多代码,但是如果需要访问游标记录条数,就需要loop或while循环。

forloop 语法:

FOR curRow   IN CURSOR_NAME  -- curRow是游标的行记录变量

LOOP

--直接通过curRow.游标字段取值(省略了变量的定义)

ENDLOOP;

 

3、日期的加减计算

DATE类型是一个7字节的定宽日期/时间数据类型。它总是包含7个属性,包括:世纪、世纪中哪一年、月份、月中的哪一天、小时、分钟和秒;TIMESTAMP类型与DATE非常类似,只不过另外还支持小数秒和时区。下面的N值可以为负数。

 

Ø  使用NUMTODSINTERVAL内置函数来增加小时、分钟和秒。

比如:DATE+NUMTODSINTERVAL(n,'minute')

 

Ø  加一个简单的数来增加天。

比如:DATE+n

 

Ø  使用ADD_MONTHS内置函数来增加月和年。

比如:ADD_MONTHS(DATE,n)

 

4、日期类型转成字符

       select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ssxff')time1 from dual;

       --年月日时分秒及6位毫秒;

       select to_char(systimestamp  ,'yyyy-mm-dd hh24:mi:ss.ff1') from dual;

       --年月日时分秒及毫秒(位数由ff后面的数字决定,1~9之间,ff3表示保留三位毫秒)

 

5、if exist 替代语法

       oracel没有sqlserver的if exist 语法,只能变形实现,建议使用下面的语法:

v_cnt            number(4); -- 声明变量;

selectcount(*) into v_cnt from dual where exists (SELECT 语句);

示例:

declare

  v_cnt number;

begin

  select count(*)  into v_cnt from dual

        where exists (select * from table_namewhere col_name=1);

  if v_cnt = 0 then

dbms_output.put_line('无记录, 在此写你的业务代码');

endif;

end;

 

6、空值

       如果字段不允许为空,使用nvl函数;如:nvl(field_name,’ ’),需要说明的两个单引号直接是空格,如果没有任何字符,oracle也视为null。

 

7、调试存储过程

       复杂的业务一般都需要调试,感觉PLSQLDeveloper调试比较方便。右键选择需要调试的存储过程,在测试窗口即可单步调试。



在oracle中创建存储过程的语法

如果你要取返回值,必须定义游标,如果用游标返回取到的值,必须定义包,在包里写存储过程。
你也可以用楼上的方法把数据写进另一张表,不过要记得每次调用时还把表删掉。
create or replace procedure sp_get_users_byId(param1 in varchar2)
is
s varchar2(2000);
begin
s:='drop table ls_table';
execute immediate s;
s:='create table ls_table as (
select * from scott.tbUsers where userId=param1)';
execute immediate s;
end sp_get_users_byId;
 

问几个oracle存储过程语法的问题

第一个问题:is和as是可以互用的,用哪个都没关系的
第二个问题:在外面
第三个问题:过程中没有declare关键字,declare用在语句块中
第四个问题:估计你看到的是做游标定义的东东,抑或者直接就一句sql。
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/3856.html NewsArticle 项目中oracle存储过程记录——常用语法备忘,oracle存储过程 项目中oracle存储过程记录——常用语法备忘 项目中需要写一个oracle存储过程,需求是收集一个复杂查询的内容(涉及到多张...
评论暂时关闭