gpt4 book ai didi

oracle - 在 Oracle 中,IN 运算符后面的内容是否有数据类型?

转载 作者:行者123 更新时间:2023-12-02 00:56:08 24 4
gpt4 key购买 nike

我有一个关于 Oracle PL/SQL 的问题。

在过程中,相同的嵌入式 SELECT 语句与查询中的 WHERE 子句重复使用:

...
where start_year in (
SELECT MB_START FROM MEMBERS
)
...

嵌入在过程中 WHERE 子句中的实际 SELECT 语句是更详细,并替换为“SELECT MB_START FROM MEMBERS”以使我的问题在这里更容易理解。这正是我要问的原因问题:

在许多 WHERE 子句中重复相同的子查询很麻烦,使得堵塞的代码难以阅读,并且是服务器的潜在浪费资源。有没有办法将嵌入子查询返回的内容保存在变量中,例如:

DECLARE
start_years <type_for_IN_operator>;
BEGIN
...
select mb_start into start_years from members;
...
WHERE start_year in (start_years)
...
END;
/

我努力搜索,但未能查明 Oracle 是否支持将值保存在供 IN 运算符使用的变量中。如果支持,type_for_IN_operator 的数据类型是什么?

对答案和进一步问题的回应:

感谢大家对问题的回答。

我问这个问题是因为我观察到 IN 运算符接受一组不同形式的值,例如

  • 文字:IN(2015、2016、2017)
  • 从表中选择的列:IN(从成员中选择 mb_start)
  • 通过 SELECT 语句的集合:in (select column_value from table(collection))

因此我认为它们可能有一些共同点,例如我不知道的数据类型。如果有这样的数据类型,查询代码可能会更简单、更容易。

我被APC的想法所吸引,尤其是它是纯sql,而且虚拟表是可重用的。我尝试了一下,但遇到了问题。

脚本最初是:

select t.col1, t.col2, ... from
(
select ...
from ...
where start_year in (<that subquery>)
union
select ...
from ...
where start_year in (<that subquery>)
union
...
) t
join ...
...

现在使用虚拟表并替换第一个原始子查询:

with sqf as (
SELECT MB_START FROM MEMBERS
)
select t.col1, t.col2, ... from
(
select ...
from ...
where start_year in (select * from sqf)
union
select ...
from ...
where start_year in (<that subquery>)
union
...
) t
join ...
...

而且查询的完成速度甚至比原始代码还要快一点。但是,当第二个 也替换为 sqf 虚拟表时,查询将永远运行,尽管它也没有吐出任何错误。我不得不杀掉它。我又尝试了几次,结果都是一样。

有什么建议吗?

最佳答案

oracle 中的任何查询都会根据选择的列返回游标。是否在 IN 条件下调用它并不重要。

但是,如果您想保存子查询的结果以便在多个查询中重复使用,您可以创建一个 TYPE 并在其中批量收集您的值。

CREATE TYPE MEMBER_TAB_TYPE AS TABLE OF DATE;

DECLARE
MB_START_TABLE MEMBER_TAB_TYPE;
BEGIN
SELECT MB_START BULK COLLECT INTO MB_START_TABLE FROM MEMBERS;
....
WHERE START_YEAR IN (SELECT COLUMN_VALUE FROM TABLE(MB_START_TABLE));
....
END;

您可以在程序中根据需要多次使用 MB_START_TABLE,而无需实际查询 MEMBERS 表,因为“SELECT COLUMN_VALUE FROM TABLE(MB_START_TABLE)” 将始终获取本地存储的值。

关于oracle - 在 Oracle 中,IN 运算符后面的内容是否有数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55580470/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com