【问题标题】:ORACLE - Variable IN Clause - Function to return list of numbersORACLE - 变量 IN 子句 - 返回数字列表的函数
【发布时间】:2015-08-19 07:26:58
【问题描述】:

我正在尝试构建一个返回数字列表的函数,用于 IN 子句。

该函数需要一个参数(parentcustomer_id),该函数需要运行另一个 SQL 查询以返回与该父级相关的 customer_id。

查询用法示例:

SELECT customername 
FROM customertable 
WHERE customer_id IN myfunction(parentcustomer_id)

预期结果:

SELECT customername 
FROM customertable 
WHERE customer_id IN (500006,500007,500008,50009)

该函数应返回一个逗号分隔的数字列表,该列表对 IN 子句有效。

我尝试创建一个返回数字表的“类型”,但 Oracle 抱怨“无效数字”。

我已经在 Google 上搜索了几天,并尝试了无数方法来实现这一目标,但无济于事。

有什么想法吗?

【问题讨论】:

  • 贴出你为实现此目的而创建的函数

标签: oracle function


【解决方案1】:

您必须创建集合。

create type numbers is table of number;

create or replace function ret_numbers return numbers is 
 v numbers := new numbers();
begin 
 v.extend(3);
 v(1):=1;
 v(2):=5;
 v(3):=9;
 return v;
end;



with test_data as (select level lv from dual connect by level <10)
select * from test_data where lv member of ret_numbers;

with test_data as (select level lv from dual connect by level <10)
select * from test_data where lv in (select * from table(ret_numbers)) ;

【讨论】:

  • 谢谢!我在函数中 select 语句的 INTO 部分遇到了困难。我收到一个错误:“表达式 'NUMBERS' 不适合作为赋值语句的左侧”CREATE OR REPLACE FUNCTION SUMPROD_GALAXY.ret_numbers (p_customer_id IN sumprod.customer.customer_id%type) return numbers is v numbers := new numbers(); begin SELECT customer0.customer_id INTO numbers FROM sumprod.businesspartnerpartnerrole.......
  • 为了澄清,我还必须向函数添加一个参数(输入客户 ID)。预期回报是其他相关客户 ID 的数组。
  • SELECT customer0.customer_id bulk collect INTO v FROM .... 其中 v 是声明为 v numbers 的变量,数字是使用 create type numbers is table of number; 创建的架构级别集合
  • 查看 oracle 的文档并阅读有关集合和“批量收集”查询的内容
  • 完美 - 只需一点阅读,以及您的大量帮助 - 全部整理完毕!非常感谢! :)
【解决方案2】:

为什么不在没有该功能的查询中执行此操作

SELECT customername 
FROM customertable c
WHERE customer_id IN (SELECT parentcustomer_id 
FROM parentCustomerTable p 
WHERE p.customer_id = c.customer_id)

甚至将 2 个表连接在一起而不使用 IN

【讨论】:

  • 是的,我绝对可以做到。我想要在函数中执行此操作的原因是,它在我们的环境中非常常见,并且在非常大的查询中多次使用它。该功能将大大简化查询。感谢您的回复!
【解决方案3】:

以下查询将以逗号分隔所有值,您可以从函数输出参数返回相同的值

select listagg(parentcustomer_id,',') within group (order by parentcustomer_id) cnt from parentCustomerTable where parentcustomer_id = 'your input'; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 2016-04-02
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    相关资源
    最近更新 更多