oracle - 如何根据 Oracle 中的动态列表检查 IN 条件?

标签 oracle list plsql cursor

编辑:更改标题以适合下面的代码。

我正在尝试从 Oracle 表中检索可接受值的列表,然后对另一个表执行 SELECT,同时将某些字段与所述列表进行比较。

我尝试使用光标执行此操作(如下所示),但失败了。

DECLARE
    TYPE gcur IS REF CURSOR;
    TYPE list_record IS TABLE OF my_table.my_field%TYPE;
    c_GENERIC gcur;
    c_LIST list_record;
BEGIN
    OPEN c_GENERIC FOR
    SELECT my_field FROM my_table
    WHERE some_field = some_value;

    FETCH c_GENERIC BULK COLLECT INTO c_LIST;

    -- try to check against list
    SELECT * FROM some_other_table
    WHERE some_critical_field IN c_LIST;

END

基本上,我想做的是将可接受的值列表缓存到变量中,因为稍后我将反复检查它。

如何在 Oracle 中执行此操作?

最佳答案

我们可以使用集合来存储值以满足您的目的,但它们需要声明为 SQL 类型:

create type list_record is table of varchar2(128)
/

这是因为我们不能在 SQL 语句中使用 PL/SQL 类型。唉,这意味着我们不能使用 %TYPE%ROWTYPE,因为它们是 PL/SQL 关键字。

您的程序将如下所示:

DECLARE
    c_LIST list_record;
BEGIN

    SELECT my_field 
    BULK COLLECT INTO c_LIST 
    FROM my_table
    WHERE some_field = some_value;

    -- try to check against list
    SELECT * FROM some_other_table
    WHERE some_critical_field IN ( select * from table (c_LIST);

END;    

"I see that you still had to perform a SELECT statement to populate the list for the IN clause."

如果值在表中,则没有其他方法可以将它们放入变量:)

"I'm thinking that there's a significant performance gain using this over a direct semi-join"

不一定。如果您只使用这些值一次,那么子查询肯定是更好的方法。但是,当您希望在多个离散查询中使用相同的值时,填充集合是更有效的方法。

在 11g 企业版中,我们可以选择使用 result set caching 。这是一种更好的解决方案,但并不适合所有表。

关于oracle - 如何根据 Oracle 中的动态列表检查 IN 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3462011/

相关文章:

regex - PL/SQL函数返回带有正则表达式特殊字符的字符串

python - Python中列表列表中的列表中的值的平均值

c# - 如何使用将使用相同构造函数的相同元素初始化引用类型列表?

php - 执行查询时出错

oracle - 创建一个 pl/sql 函数来查找闰年

oracle - PL-SQL : getting column data types out of query results

java - 使用elasticsearch为Oracle等现有关系数据库建立索引

sql - 违反 - 找不到父键错误

SQL:删除重复记录 - 尽管类型不同

python - 在 Python 中创建一个列表,其中包含来自 csv 文件中特定列的数据