简要比较:

replace:字符串级别的代替

如:SELECT REPLACE('acdd','cd','ef') FROM dual; →aefd

translate:字符级别的代替

如:SELECT TRANSLATE('acdd','cd','ef') FROM dual; →aeff

分别详解:

replace:

语法:REPLACE ( char , search_string [, replacement_string] )

REPLACE returns char with every occurrence of search_string replaced with replacement_string. If replacement_string is omitted or null, then all occurrences of search_string are removed. If

search_string is null, then char is returned.

解释:repalce中,每个search_string都被replacement_string所代替。

select replace('acdd','cd','ef') from dual;→ aefd

如果replacement_string为空或为NULL,那么所有的search_string都被移除。

select replace('acdd','cd','') from dual;→ad

如果search_string为null,那么就返回原来的char。

select replace('acdd','','ef') from dual;→acdd

select replace('acdd','','') from dual;→acdd(也是两者都为空的情况)

Both search_string and replacement_string, as well as char, can be any of the datatypes CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, or NCLOB. The string returned is of VARCHAR2 datatype and is in

the same character set as char.

解释:这段指明了可以用的数据类型。

This function provides functionality related to that provided by the TRANSLATE function. TRANSLATE provides single-character, one-to-one substitution. REPLACE lets you substitute one string for

another as well as to remove character strings.

解释:红色部分也是replace和translate的区别。

translate:

语法:TRANSLATE ( 'char' , 'from_string' , 'to_string' )

TRANSLATE returns char with all occurrences of each character in from_string replaced by its corresponding character in to_string. Characters in char that are not in from_string are not

replaced. The argument from_string can contain more characters than to_string. In this case, the extra characters at the end of from_string have no corresponding characters in to_string. If these

extra characters appear in char, then they are removed from the return value.You cannot use an empty string for to_string to remove all characters in from_string from the return value. Oracle

interprets the empty string as null, and if this function has a null argument, then it returns null.

解释:Translate中,每个from_string中的字符被to_string中相应的字符所代替。

select translate('acdd','cd','ef') from dual;→aeff

如果from_string比to_string长,那么from_string中多余的字符将被移除。

select translate('acdd','acd','ef') from dual;→ef (a由e代替,c由f代替,d就被移除)

select translate('acdd','cda','ef') from dual;→eff(c由e代替,d由f代替,a就被移除)

如果to_string为空,或者两者都为空,那么返回char也为空。所以to_string不能为空。

select translate('acdd','cd','') from dual;→ (空)

select translate('acdd','','') from dual;→(空)

实战:

如何判断一个字符串是否是数字?

解:先转换:由于to_string不能为空,我们巧用#号代替

select translate('abc123','#1234567890.','#') from dual;→abc

from_string中的#被to_string中的#代替,但char中又没有#字符,所以通过这一步躲开了to_string必须不为空的规则。然后后面的数字以及小数点都转换为空,于是原来的字符串中只留下abc三个字符。

转换好后,用nvl2判断即可:

select nvl2(translate('abc123','#1234567890.','#'),'字符串','数字') from dual;→字符串

nvl2的作用就是,NVL2 (expr1, expr2, expr3) ->expr1不为NULL,返回expr2;为NULL,返回expr3。这样我们就可以判断一个字符串是否是数字了!解毕!

游标

close cursor_name

关闭的游标可以再次被打开,因此,可以多次创建活动集。任何对关闭了的游标的操作都会引发INVALID_CURSOR错误。

每个用户可打开的游标的数量都是有限制的,其数量由数据库参数域中的OPEN_CURSORS参数来决定,缺省时OPEN_CURSORS=50.

游标的属性

每个游标有四个属性可以用于访问游标的环境区域:

(1)%NOTFOUND 为了从一个显式游标中处理多行数据,可以定义一个循环,每次循环提取一行数据。对于不成功的提取,%NOTFOUND属性的值为TRUE.

(2)%FOUND 对于成功的数据提取,返回TRUE.

(3)%ROWCOUNT 返回当前从活动集合获取的行数。

(4)%ISOPEN 仅当游标处于打开状态时,才可以从中提取数据。可以使用%ISOPEN游标属性来检测游标是否已被打开。

注意:%ISOPEN返回游标的状态。并不是每次都需要检查%ISOPEN。

游标式的FOR循环

游标式的FOR循环,它的循环索引声明为%ROWTYPE的记录,然后隐式地打开游标,并且从活动集反复提取行的值,当所有行都处理完后,游标将自动关闭。当提取最后一行时,循环会自动终止。

语法:FOR record_name IN cursor_name LOOP

...

END LOOP;

(1)不需要声明控制循环的记录,记录的作用域仅限于FOR循环内部。

(2)如果需要,为游标提供参数,参数放在FOR语句中游标名后的圆括号内。

(3)当需手工处理游标时,不能使用游标式的FOR循环。

发送接口:

//在mz_byl_fr_contract表做update操作后作为触发点

CREATE OR REPLACE TRIGGER BYLERP.BYL_FILTERRODCONTRACT_RECEIVE

after update of useflg on mz_byl_fr_contract

for each Row

//声明变量

Declare

billidVar   Varchar2(36);

dataCount1 int;

dataCount2 int;

begin

If :Old.useflg!=:New.useflg And :new.useflg='1' Then

Select Count(*) Into dataCount1 From BYL_FilterRodContractDet Where :New.Rid=REPLACE(Id, '-', '');

If dataCount1>0 Then

Select billid Into billidVar  From BYL_FilterRodContractDet Where :New.Rid=REPLACE(Id, '-', '');

Select Count(*) Into dataCount2 From BYL_FilterRodContractDet Where billID=billidVar And operationMark='0';

If dataCount2=1 Then

Update BYL_FilterRodContractDet Set operationMark='1' Where :New.Rid=REPLACE(Id, '-', '');

Update BYL_FilterRodContract Set operationMark='1' Where Id = billidVar;

End If;

If dataCount2>1 Then

Update BYL_FilterRodContractDet Set operationMark='1' Where :New.Rid=REPLACE(Id, '-', '');

Update BYL_FilterRodContract Set operationMark='2' Where Id = billidVar;

End If;

End If;

end if;

end;

接收接口数据:这里简单用到了游标的例子:

CREATE OR REPLACE TRIGGER BYLERP.BYL_FILTERRODCONTRACT_SEND

after update of billStatus on BYL_FilterRodContract

for each Row

Declare

cursor contract_cur is Select * From BYL_FilterRodContractDet Where billID=:New.Id;

xu contract_cur%rowtype;

begin

If :Old.billStatus!=:New.billStatus And :new.billStatus='0050' Then

open contract_cur;

fetch contract_cur into xu;

While contract_cur%found

Loop

insert into mz_byl_fr_contract(Rid,ctrno ,i_verno,custcd,cust,address,exedt,

enddt,gcode,gname,qnt,fcy,Trans_time,useflg)

Values(REPLACE( xu.Id, '-', ''),SUBSTR(:New.contractCode,1,30),:New.version,SUBSTR(:New.clientEnterpriseCode,1,8),:New.clientEnterpriseName,:New.destination,:New.signatureDate,

:New.contractEndDate,SUBSTR(xu.filterRodcode,1,16),xu.filterRodName,xu.machineAmounts,xu.unitPrice,

to_date(to_char(Sysdate,'yyyy-MM-dd'),'yyyy-MM-dd'),'0');

fetch contract_cur into xu;

End Loop;

close contract_cur;

end if;

end;

oracle 游标的替代,Oracle中replace函数和translate函数以及简单的游标相关推荐

  1. sql中的trim()以及translate()函数

    oracle 函数 介绍一下sql中的trim()以及translate()函数 首先说一下trim(),trim()和我们接触的编程语言一样也是用来去掉前后空格的,LTRIM(),RTRIM(),T ...

  2. 第六十六章 Caché 函数大全 $TRANSLATE 函数

    文章目录 第六十六章 Caché 函数大全 $TRANSLATE 函数 大纲 参数 描述 `$TRANSLATE`和`$REPLACE` 示例 第六十六章 Caché 函数大全 $TRANSLATE ...

  3. oracle 字段全大写,Oracle如何批量将表中字段名全转换为大写(利用简单存储过程)...

    前言 今天查询一个数据字段一直提示字符无效,明明在数据库表字段中是存在的: 查询后得知,数据库表字段为小写时,查询需要将字段名小写并加上双引号: 表名同理,我这里表名是大写,暂时不需要改. 搜到一个批 ...

  4. 在oracle中游标的操作,Oracle中的游标和函数详解

    Oracle中的游标和函数详解 1.游标 游标是一种 PL/SQL 控制结构:可以对 SQL 语句的处理进行显示控制,便于对表的行数据 逐条进行处理. 游标并不是一个数据库对象,只是存留在内存中. 操 ...

  5. oracle中prad函数_024 SQL函数

    1. 使用ORDER BY排序 (1) ORDER BY 子句的作用是什么? 用ORDER BY子句排序. 用于对结果集进行排序处理,提供了升序排序(ASC)与降序排序(DESC)如果不指定排序规则默 ...

  6. MySQL里和trunc函数相同的_mysql 函数中与Oracle中ltrim函数功能相同的函数是什么函数?...

    一.ANSI字符函数 字符函数用于在SQL里以不同于存储方式的格式来表示字符串. 串接就是把两个单独的字符串组合为一个. 子串的概念就是从字符串里提取一部分. TRANSLATE函数用于逐字符地把一个 ...

  7. Oracle -- Oracle中几个数字函数、转换函数、字符串函数

    一.数字函数 数字型函数输入数字型参数并返回数值型的值.多数该类函数的返回值支持38位小数点,如:COS, COSH, EXP, LN,LOG, SIN, SINH, SQRT, TAN, and T ...

  8. oracle 正则表达式拆分字符串,oracle中通过正则表达式函数处理逗号分隔的字段...

    这个题目的确不大好写,其实际含义基于一个场景: 比如在oracle的某张表中,有两个字段 A1          B1 1         A,B,C,D, 2         E,F 假如现在的需求 ...

  9. oracle实现mysql的if_oracle中decode函数 VS mysql中的if函数和case函数

    oracle中有decode函数,如下: select sum(decode(sex,'男',0,1)) 男生数 from school: 统计男生数目,含义为:decode()中sex字段为男时,用 ...

最新文章

  1. java 图片 base64_java实现图片转base64字符串 java实现base64字符串转图片
  2. 海康摄像头取、录像机RTSP视频流的字串格式
  3. win32汇编处理字符消息和给常量区标号赋值
  4. c语言怎么删除字符串中的指定字符_Java中你知道几种从字符串中找指定的字符的数量
  5. VTK:vtkBillboardTextActor3D用法实战
  6. 【Numpy学习记录】np.transpose讲解
  7. 汇编.s文件包含头文件处理
  8. 电脑QQ能登上,网页打不开的解决办法
  9. 《中国人工智能学会通讯》——11.64 基于成对约束的属性特征选择
  10. ActiveXObject文件读写
  11. kerberos安全认证
  12. winform基础,主要控件简单介绍,以及小练习
  13. 图邻接表拓扑排序算法c语言完整,在用邻接表表示图时,拓扑排序算法时间复杂度为()...
  14. SpringBoot自动装配原理与自己写一个starter
  15. 【案例分享】利用Python识别图片中的文字
  16. oracle中的than,range分区values less than,代表的是小于等于还是小于啊。
  17. MATLAB绘制三维曲面图和等高线 绘图(2)
  18. 如何创建一个网站?初学者的分步指南
  19. Tolua使用笔记一:开始使用Tolua的准备工作与lua文件读取方法
  20. Mac HomebrewCN被墙

热门文章

  1. 关于childNodes的删除
  2. POJ-3421 X-factor Chains---求因子+递推 或 素因子+组合数学
  3. mybatis11--多对多关联查询
  4. 玩,玩什么,怎么玩?
  5. 【引用】IP地址已经分配给另一个适配器问题的解决方法
  6. 关于web应用程序的安全验证
  7. AJAX淋漓尽致的发挥(Google个性化主页 VS. Windows Live.COM)站在互联网浪尖上窃喜...
  8. linux xorg 文件 位置,Linux系统中xorg.conf文件详细介绍
  9. burst什么意思_为什么Windows/iOS操作很流畅而Linux/Android却很卡顿呢?
  10. 目录:关于【稳定性建设之道】大纲速览