oracle存储过程 语法 函数 总结.docx
《oracle存储过程 语法 函数 总结.docx》由会员分享,可在线阅读,更多相关《oracle存储过程 语法 函数 总结.docx(7页珍藏版)》请在冰豆网上搜索。
![oracle存储过程 语法 函数 总结.docx](https://file1.bdocx.com/fileroot1/2023-1/27/e1a9afd5-afa6-42d8-8b9b-b3bf7dc54a6e/e1a9afd5-afa6-42d8-8b9b-b3bf7dc54a6e1.gif)
oracle存储过程语法函数总结
oracle存储过程语法函数总结
对于oracle 存储过程是很优秀的一种脚本语言。
下面是一些整理:
一,Plsql调试存储过程:
1、 在oracle的配置和移植工具àNETMANAGER中配置连接
2、 在plsql中新建SQL窗口,编写存储过程
3、 在plsql中新建测试窗口,在begin end之间调用
4、 查看编译错误:
在命令窗口中showerrorsprocedureprocedure_name
或者 编辑的方式打开存储过程,在编译时会有错误提示
一,Plsql调试存储过程:
1、 在oracle的配置和移植工具àNETMANAGER中配置连接
2、 在plsql中新建SQL窗口,编写存储过程
3、 在plsql中新建测试窗口,在begin end之间调用
4、 查看编译错误:
在命令窗口中showerrorsprocedureprocedure_name
或者 编辑的方式打开存储过程,在编译时会有错误提示
二,oracle存储过程基本语法
1、 oracle存储过程结构:
CREATEORREPLACEPROCEDURE存储过程名
(
输入输出参数
)
IS
变量定义
BEGIN
代码;
END存储过程名;
2、 if语句:
If逻辑表达式then
Begin
End;
Endif;
If 逻辑表达式then
Begin
End;
Else
Begin
End;
Endif;
If逻辑表达式then
Begin
End;
Elseif逻辑表达式then
Begin
End;
Else
Begin
End;
Endif;
3、 For循环
For in loop
…
Endloop;
E.g:
CREATEORREPLACEPROCEDURETEST
is
BEGIN
foriin1..100LOOP
DBMS_OUTPUT.put_line(i);
endLOOP;
ENDTEST;
注:
这里的i可以不用申明,并且在循环体中,i会自增
4、 while循环
While条件语句loop
Begin
End;
EndLOOP;
E.g:
CREATEORREPLACEPROCEDURETEST
is
iint:
=1;
BEGIN
whilei<100LOOP
DBMS_OUTPUT.put_line(i);
i:
=i+1;
endLOOP;
ENDTEST;
注:
这里的i需要申明,并且循环体中,要对i进行改变
5、 游标的使用:
定义游标
打开游标
提取数据
关闭游标
E.g:
CREATEORREPLACEPROCEDURETEST
is
v_fidnvarchar2(80);
Cursorcur_testis
selectfidfromt_pm_user;--定义游标
BEGIN
opencur_test;--打开游标
ifcur_test%notfound
then --判断游标中数据是否为空
rollback;
endif;
loop--循环游标
fetch
cur_testintov_fid;--提取游标数据
DBMS_OUTPUT.put_line(v_fid);
EXIT
WHENcur_test%NOTFOUND; --游标数据为空后退出循环
endloop;
closecur_test;--关闭游标
ENDTEST;
三,oracle与sqlserver部分差异
1、 常用函数差异
Ø 绝对值
S:
selectabs(-1)value
O:
selectabs(-1)valuefromdual
Ø 取整(大)
S:
selectceiling(-1.001)value
O:
selectceil(-1.001)valuefromdual
Ø 取整(小)
S:
selectfloor(-1.001)value
O:
selectfloor(-1.001)valuefromdual
Ø 取整(截取)
S:
selectcast(-1.002asint)value
O:
selecttrunc(-1.002)valuefromdual
Ø 四舍五入
S:
selectround(1.23456,4)value1.23460
O:
selectround(1.23456,4)valuefromdual1.2346
Ø 取随机数
S:
selectrand()value
O:
selectsys.dbms_random.value(0,1)valuefromdual
Ø 如何处理null值(F2中的null以10代替)
S:
selectF1,IsNull(F2,10)valuefromTbl
O:
selectF1,nvl(F2,10)valuefromTbl
Ø 连接
S:
select'11'+'22'value
O:
selectCONCAT('11','22') value fromdual
Ø 子串位置--返回3
S:
selectCHARINDEX('s','sdsq',2)value
O:
selectINSTR('sdsq','s',2)valuefromdual
Ø 求子串
S:
selectsubstring('abcd',2,2)value
O:
selectsubstr('abcd',2,2)valuefromdual
Ø 子串代替返回aijklmnef
S:
SELECTSTUFF('abcdef',2,3,'ijklmn')value
O:
SELECTReplace('abcdef','bcd','ijklmn')valuefromdual
Ø 子串全部替换
S:
没发现
O:
selectTranslate('fasdbfasegas','fa','我')valuefromdual
Ø 长度
S:
len,datalength
O:
length
Ø 左补空格(LPAD的第一个参数为空格则同space函数)
S:
selectspace(10)+'abcd'value
O:
selectLPAD('abcd',14)valuefromdual
Ø 右补空格(RPAD的第一个参数为空格则同space函数)
S:
select'abcd'+space(10)value
O:
selectRPAD('abcd',14)valuefromdual
Ø 删除空格
S:
ltrim,rtrim
O:
ltrim,rtrim,trim
Ø 系统时间
S:
selectgetdate()value
O:
selectsysdatevaluefromdual
Ø 求日期
S:
selectconvert(char(10),getdate(),20)value
O:
selecttrunc(sysdate)valuefromdual
selectto_char(sysdate,'yyyy-mm-dd')valuefromdual
Ø 求时间
S:
selectconvert(char(8),getdate(),108)value
O:
selectto_char(sysdate,'hh24:
mm:
ss')valuefromdual
Ø 字符串转时间
S:
可以直接转或者selectcast('2004-09-08'asdatetime)value
O:
SELECTTo_date('2004-01-0522:
09:
38','yyyy-mm-ddhh24-mi-ss')vauleFROM
DUAL
Ø 求两日期某一部分的差(比如秒)
S:
selectdatediff(ss,getdate(),getdate()+12.3)value
O:
直接用两个日期相减(比如d1-d2=12.3)
SELECT(d1-d2)*24*60*60vauleFROMDUAL
Ø 根据差值求新的日期(比如分钟)
S:
selectdateadd(mi,8,getdate())value
O:
SELECTsysdate+8/60/24vauleFROMDUAL
2、 其它差异
Ø 返回记录集
S:
直接在存储过程中用select即可
O:
一般在参数中定义一个游标类型的输出参数,在过程体中用open游标名称for select的方式返回记录集
Ø 代码格式
S:
语句结尾不用加分号
O:
语句结尾需要加分号
Ø 临时表
S:
一般动态创建临时表,临时表是一种”内存表”,不用后会自动删除表结构
O:
提前创建好临时表,oracle中临时表保存的是一个会话或者事务的数据,当断开连接或事务提交回滚后,临时表中的数据自动清空(清空的只是当前会话的临时表数据),但表结构还存在。
由于Oracle不是一种内存中的数据库.
所以如果Oracle类似SQLServer频繁的对临时表进行建立和删除,必定会影响性能.所以Oracle会保留临时表的定义直到用户DROP
TABLE。
Ø 自增长字段
S:
有专门的自增长字段
O:
需要在数据库中创建序列(sequence),使用时用序列名称.Nextval获得
Ø 执行字符串的sql语句
S:
exec(sql字符串)
O:
executeimmediatesql字符串;
Ø 字符串连接
S:
用+号
O:
用||号