gpt4 book ai didi

oracle - 可以在select语句where子句中使用表变量吗?

转载 作者:行者123 更新时间:2023-12-05 01:35:05 24 4
gpt4 key购买 nike

我有一个存储过程正在执行两步查询。第一步是从表中收集VARCHAR2类型字符的列表,并将它们收集到表变量中,定义如下:

TYPE t_cids IS TABLE OF VARCHAR2(50) INDEX BY PLS_INTEGER;
v_cids t_cids;

所以基本上我有:
SELECT item BULK COLLECT INTO v_cids FROM table_one;

直到下一位为止,它都可以正常工作。

现在,我想在同一过程中的另一个查询的where子句中使用该集合,如下所示:
SELECT * FROM table_two WHERE cid IN v_cids;

有没有办法做到这一点?我可以选择一个单独的元素,但是我想像使用常规表一样使用table变量。我已经尝试过使用嵌套选择进行变体,但这似乎也不起作用。

非常感谢,

扎克

最佳答案

关于如何实现这一点,您有几种选择。

如果要使用集合,则可以使用TABLE函数从中进行选择,但是所使用的集合类型变得很重要。

举一个简单的例子,这将创建一个数据库类型,它是一个数字表:

CREATE TYPE number_tab AS TABLE OF NUMBER
/

Type created.



然后,下一个块填充该集合,并使用该集合作为表从中执行基本选择,并将其连接到 EMP表(具有一些输出,以便您可以看到发生了什么):
DECLARE
-- Create a variable and initialise it
v_num_tab number_tab := number_tab();
--
-- This is a collection for showing the output
TYPE v_emp_tabtype IS TABLE OF emp%ROWTYPE
INDEX BY PLS_INTEGER;
v_emp_tab v_emp_tabtype;
BEGIN
-- Populate the number_tab collection
v_num_tab.extend(2);
v_num_tab(1) := 7788;
v_num_tab(2) := 7902;
--
-- Show output to prove it is populated
FOR i IN 1 .. v_num_tab.COUNT
LOOP
dbms_output.put_line(v_num_tab(i));
END LOOP;
--
-- Perform a select using the collection as a table
SELECT e.*
BULK COLLECT INTO v_emp_tab
FROM emp e
INNER JOIN TABLE(v_num_tab) nt
ON (e.empno = nt.column_value);
--
-- Display the select output
FOR i IN 1 .. v_emp_tab.COUNT
LOOP
dbms_output.put_line(v_emp_tab(i).empno||' is a '||v_emp_tab(i).job);
END LOOP;
END;

从中可以看到,数据库TYPE集合(number_tab)被视为表,可以这样使用。

另一种选择是简单地将您在示例中选择的两个表连接起来:
SELECT tt.*
FROM table_two tt
INNER JOIN table_one to
ON (to.item = tt.cid);

还有其他方法可以做到,但是第一种可能最适合您的需求。

希望这可以帮助。

关于oracle - 可以在select语句where子句中使用表变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8348013/

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