12
返回列表 发新帖
楼主: 〇〇

xugu对pl/sql的支持还有问题

[复制链接]
论坛徽章:
6
2012新春纪念徽章
日期:2012-01-04 11:53:292013年新春福章
日期:2013-02-25 14:51:24林肯
日期:2013-09-12 15:57:33优秀写手
日期:2013-12-18 09:29:09慢羊羊
日期:2015-03-04 14:51:352015年新春福章
日期:2015-03-06 11:57:31
11#
发表于 2014-4-22 11:01 | 只看该作者
〇〇 发表于 2014-4-22 09:35
mystr2呢

改写了一个等价的, 减少一些函数调用:

SQL>create or replace function mytrs_ex(
2       a varchar,
3       b varchar,
4       c varchar)
5   return varchar
6   is
7       d   varchar(10);
8       idx int;
9   begin
10      if c is not null then
11          for i in 1..length(a) loop
12              idx := locate(substr(a, i, 1), b);
13
14              if idx > 0 then
15                  d := d || substr(c, idx, 1);
16              end if;
17          end loop;
18
19          return d;
20      else
21          return null;
22      end if;
23  end;
24  /
操作已执行
已用时间: 2.319(毫秒). 执行号:93.
SQL>select max(mytrs_ex(rn,'1234567890','abcdefghij')) from t100k;

行号       MAX(MYTRS_EX(RN,'1234567890','abcdefghij'))
---------- -------------------------------------------
1          ijjjj

已用时间: 662.635(毫秒). 执行号:94.
SQL>select max(mytrs_ex(rn,'1234567890','abcdefghij')) from t100k;

行号       MAX(MYTRS_EX(RN,'1234567890','abcdefghij'))
---------- -------------------------------------------
1          ijjjj

已用时间: 667.078(毫秒). 执行号:95.
SQL>

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
12#
 楼主| 发表于 2014-4-22 12:37 | 只看该作者
pkmonster 发表于 2014-4-22 11:01
改写了一个等价的, 减少一些函数调用:

SQL>create or replace function mytrs_ex(

locate函数,oracle没听说过

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
13#
 楼主| 发表于 2014-4-22 12:57 | 只看该作者
pkmonster 发表于 2014-4-22 11:01
改写了一个等价的, 减少一些函数调用:

SQL>create or replace function mytrs_ex(

不等价
SQL>select mytrs_ex('123','189','567') from dual;

行号       MYTRS_EX('123','189','567')
---------- ---------------------------
1          5

已用时间: 0.969(毫秒). 执行号:66.
SQL>select translate('123','189','567') from dual;

行号       TRANSLATE('123','189','567')
---------- ----------------------------
1          523

已用时间: 1.291(毫秒). 执行号:67.

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
14#
 楼主| 发表于 2014-4-22 13:01 | 只看该作者
〇〇 发表于 2014-4-22 12:57
不等价
SQL>select mytrs_ex('123','189','567') from dual;

create or replace function mytrs_e1(
    a varchar,
    b varchar,
    c varchar)
return varchar
is
    d   varchar(10);
    idx int;
begin
    if c is not null then
        for i in 1..length(a) loop
            idx := locate(substr(a, i, 1), b);

            if idx > 0 then
                d := d || substr(c, idx, 1);
                else
                d := d ||substr(a, i, 1);
            end if;
        end loop;

        return d;
    else
        return null;
    end if;
end;
/

SQL>select max(mytrs_ex(rn,'1234567890','abcdefghij')) from t100k;

行号       MAX(MYTRS_EX(RN,'1234567890','abcdefghij'))
---------- -------------------------------------------
1          ijjjj

已用时间: 942.741(毫秒). 执行号:71.
SQL>select max(mytrs_e1(rn,'1234567890','abcdefghij')) from t100k;

行号       MAX(MYTRS_E1(RN,'1234567890','abcdefghij'))
---------- -------------------------------------------
1          ijjjj

已用时间: 00:00:01.091. 执行号:72.

使用道具 举报

回复
论坛徽章:
6
2012新春纪念徽章
日期:2012-01-04 11:53:292013年新春福章
日期:2013-02-25 14:51:24林肯
日期:2013-09-12 15:57:33优秀写手
日期:2013-12-18 09:29:09慢羊羊
日期:2015-03-04 14:51:352015年新春福章
日期:2015-03-06 11:57:31
15#
发表于 2014-4-22 13:53 | 只看该作者
ex版本丢了没有匹配的字符,e1版本才是等价的。 这个locate好像mysql, db2都有。

使用道具 举报

回复
论坛徽章:
6
2012新春纪念徽章
日期:2012-01-04 11:53:292013年新春福章
日期:2013-02-25 14:51:24林肯
日期:2013-09-12 15:57:33优秀写手
日期:2013-12-18 09:29:09慢羊羊
日期:2015-03-04 14:51:352015年新春福章
日期:2015-03-06 11:57:31
16#
发表于 2014-4-22 13:59 | 只看该作者
"else
   return null;"  可以省略, 对于达梦7, 如果没有返回语句,会自动返回NULL

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
17#
 楼主| 发表于 2014-4-22 15:30 来自手机 | 只看该作者
Locate就是instr参数倒过来

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表