oracle 关于 in 查询得问他

_小黑_ 2017-01-23 01:40:27
RT

CREATE OR REPLACE FUNCTION GetApprovalTeamName(P_STRING IN VARCHAR2)
RETURN varchar2 AS
v_return varchar2(30000);
v_par varchar2(1000);

BEGIN
select substr(P_STRING,0,LEN(P_STRING) - 1) INTO v_par from dual;
select replace(v_par,',',''',''') into v_par from dual;
v_par := '''' || v_par || '''';
select listagg(pi.full_name,',') within group (order by pi.full_name)
into v_return
from ba_person_info pi
where pi.card_no in ( v_par );

return v_return;
END;
以上 是我写的 一个 方法
将 一个字符串 10084138,10044252,0096000486, 传到这个方法中
之后 才分 替换 截取 后 得到一个 '10084138','10044252','0096000486'
使用这个字符串 当中 参数 执行 查询 付给 v_return 这个变量
在调用 这个 方法 的时候 返回 的是空
但是 我 在 直接 查询 的时候 是 可以 查询到 数据 的
求 大神 帮忙 看一下
...全文
126 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
js14982 2017-01-23
  • 打赏
  • 举报
回复
引用 3 楼 js14982 的回复:
CREATE OR REPLACE FUNCTION GetApprovalTeamName(P_STRING IN VARCHAR2)
  RETURN varchar2 AS
  v_return varchar2(30000);
  v_par varchar2(1000);
   
BEGIN
with t as (
select regexp_substr(P_STRING, '[^,]+', 1, level) col 
from dual 
connect by level <= regexp_count(P_STRING, '\,') + 1)
select listagg(pi.full_name,',') within group (order by pi.full_name)
 into v_return
  from ba_person_info pi 
where pi.card_no in ( select col from t );
 
return v_return;
END;
多了个引号,会报错。。。
js14982 2017-01-23
  • 打赏
  • 举报
回复
CREATE OR REPLACE FUNCTION GetApprovalTeamName(P_STRING IN VARCHAR2)
  RETURN varchar2 AS
  v_return varchar2(30000);
  v_par varchar2(1000);
   
BEGIN
with t as (
select regexp_substr(P_STRING, '[^,]+', 1, level) col 
from dual 
connect by level <= regexp_count(P_STRING, '\,') + 1);
select listagg(pi.full_name,',') within group (order by pi.full_name)
 into v_return
  from ba_person_info pi 
where pi.card_no in ( select col from t );
 
return v_return;
END;
js14982 2017-01-23
  • 打赏
  • 举报
回复
你写出了这么复杂的语句?咋就不明白in这种这么简单的用法呢?
CREATE OR REPLACE FUNCTION GetApprovalTeamName(P_STRING IN VARCHAR2)
  RETURN varchar2 AS
  v_return varchar2(30000);
  v_par varchar2(1000);
   
BEGIN
with t as (
select regexp_substr('444.555.666', '[^.]+', 1, level) col 
from dual 
connect by level <= regexp_count('444.555.666', '\.') + 1)
select listagg(pi.full_name,',') within group (order by pi.full_name)
 into v_return
  from ba_person_info pi 
where pi.card_no in ( select col from t );
 
return v_return;
END;
试试这样,把你要拆分的语句,行转列做成临时表,然后在in中查询这个临时表就可以了
Diza1986 2017-01-23
  • 打赏
  • 举报
回复
引用 楼主 l397870376 的回复:

select listagg(pi.full_name,',') within group (order by pi.full_name)
 into v_return
  from ba_person_info pi 
where pi.card_no in ( v_par  );
 
这个不行的,plsql不能把v_par中的逗号当成语法,实际上使用引号把v_par括起来了, 你得用游标执行拼好的字符串

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧