ORACLE创建自定义函数返回varchar类型

需求描述:两张表,如下,需要查询tmp1表中id_new在tmp2中的name
select from tmp1;

select
from tmp2;


方法一:
好处:简单,直接sql展示
劣处:如果主表数据量太大,十几亿的话,性能会大大下降,此时建议第二种方法
select a.id_old,
to_char(wm_concat(distinct a.id_new)) id_new,
to_char(wm_concat(distinct b.name)) name
from tmp2 b,
(select a.id_old, regexp_substr(a.id_new, ‘[^,]+‘, 1, level) id_new
from tmp1 a
connect by level <= regexp_count(a.id_new, ‘,‘) + 1) a
where a.id_new = b.id_old(+)
group by a.id_old;

方法二:创建自定义函数来实现
create or replace function f_tmp_split(p_str varchar2, p_f varchar2)
return varchar2 is
v_pos pls_integer := 0; --获取当前分隔符位置
v_pre_pos pls_integer := 1; --从第几位开始截取
v_len pls_integer := 0; --字符串长度
v_len1 pls_integer := 0; --分隔符长度
v_result dbms_sql.Varchar2_Table; --结果集
v_num pls_integer := 1; --元素数量
v_name_class varchar2(1000); --返回的集合
v_name_tmp varchar2(1000); --返回拼接的值
begin
v_len := length(p_str);
v_len1 := length(p_f);
while v_pos < v_len loop
v_pos := instr(p_str, p_f, v_pre_pos);
if v_pos = 0 then
v_pre_pos := v_len;
v_result(v_num) := substr(p_str, v_pre_pos);
begin
select a.name
into v_name_tmp
from tmp2 a
where a.id_old = v_result(v_num);
exception
when no_data_found then
v_name_tmp := ‘‘;
end;
v_name_class := v_name_class || v_name_tmp;
if v_pre_pos >= v_len then
exit;
end if;
else
v_result(v_num) := substr(p_str, v_pre_pos, v_pos - v_pre_pos);
begin
select a.name || p_f
into v_name_tmp
from tmp2 a
where a.id_old = v_result(v_num);
exception
when no_data_found then
v_name_tmp := ‘‘;
end;
v_name_class := v_name_class || v_name_tmp;
v_pre_pos := v_pos + v_len1;
end if;
end loop;
return v_name_class;
end;

效果如下:

原文地址:https://blog.51cto.com/12777507/2433789

时间: 2024-11-07 22:13:38

ORACLE创建自定义函数返回varchar类型的相关文章

PHP自定义函数返回多个值

PHP自定义函数只允许用return语句返回一个值,当return执行以后,整个函数的运行就会终止. 有时要求函数返回多个值时,用return是不可以把值一个接一个地输出的. return语句可以返回任何类型的变量,这就是使自定义函数返回多个值的关键. 代码:  <?php function results($string) {      $result = array();      $result[] = $string;//原字符串     $result[] = strtoupper($

mysql创建自定义函数与存储过程

mysql创建自定义函数与存储过程 一 创建自定义函数 在使用mysql的过程中,mysql自带的函数可能不能完成我们的业务需求,这时就需要自定义函数,例如笔者在开发过程中遇到下面这个问题 mysql表结构如下 DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `pic` varchar(50) NOT NULL, `hashcode` varchar

扩展JMeter - 创建自定义函数 - String Joiner (翻译)

JMeter是测试自动化社区中最好的开源工具之一.它提供了所有可能的扩展,可以快速提供我们的测试脚本.为了让我们的生活更轻松,它还让我们通过实现几个接口来提出我们自己的插件. 在本文中,让我们看看如何创建自定义函数并使其出现在下面的JMeter 函数帮助器对话框中. 目标: 我的目标是创建一个简单的Join函数,它将使用给定的分隔符连接2个给定的字符串并将其存储在用户定义的变量中. 用法是   $ {__ join(string1,string2,delimiter,resultVariable

mysql 报错之创建自定义函数

I experienced this error while trying to alter one of my stored procedures remotely on a master server. After some research, I ended up getting information from “Binary Logging of Stored Programs“. From MySQL Reference in verbatim:When you create a s

MySQL下创建序列及创建自定义函数方法介绍

工作过程中需要将基于DB2数据库的应用以及数据迁移到MySQL中去,在原应用中,大量使用了SEQUENCE,考虑尽量减少代码的修改,决定在迁移后的应用中继续保留SEQUENCE的使用,这就要求在MySQL中寻找替代SEQUENCE的解决方案. 在DB2中创建一个SEQUENCE的方法如下: DROP SEQUENCE TRZ_MEMBER.SEQ_TRZ_MEMBER_NO; CREATE SEQUENCE TRZ_MEMBER.SEQ_TRZ_MEMBER_NO AS BIGINT INCRE

MySQL 创建自定义函数(1)

1. 创建测试自定义函数(1) CREATE DEFINER=`dbdh`@`localhost` FUNCTION `test`.`sp_function_dbdh_three`() RETURNS varchar(255) CHARSET utf8BEGIN    DECLARE l_NEW_STR VARCHAR(255);  -- 定义变量    DECLARE l_NAYIBU_NUM1   INT;     SET l_NAYIBU_NUM1=101; IF (l_NAYIBU_NU

Oracle基础 自定义函数

一.函数 函数与存储过程相似,也是数据库中存储的已命名PL-SQL程序块.函数的主要特征是它必须有一个返回值.通过return来指定函数的返回类型.在函数的任何地方可以通过return expression语句从函数返回,返回类型必须和声明的返回类型一致. 语法: create [or replace] function function_name [(parameter_list)] return datatype {is/as} [local_declarations] begin exec

php curl返回false----curl调用微信创建自定义菜单返回false

在调用微信公众平台的创建自定义菜单接口来创建自定义菜单时遇到一个大坑,php curl返回false一直无法调试通过,代码如下: > //创建菜单public function menu_create($data){$url =" https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$this->get_access_token()}";echo $url.'----------<br>'; r

Oracle之自定义函数

数据库中函数包含四个部分:声明.返回值.函数体和异常处理. --没有参数的函数 create or replace function get_user return varchar2 is v_user varchar2(50); begin select username into v_user from user_users; return v_user; end get_user; --测试 方法一 select get_user from dual; 方法二 SQL> var v_nam