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

时间:2011-12-01 20:44:15

标签: oracle collections oracle11g

我有一个执行两步查询的存储过程。第一步是从表中收集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;

有办法做到这一点吗?我能够选择一个单独的元素,但我想使用表变量,就像使用常规表一样。我尝试过使用嵌套选择的变体,但这似乎也不起作用。

非常感谢,

扎克

2 个答案:

答案 0 :(得分:6)

关于如何实现这一目标,你有几种选择。

如果你想使用一个集合,那么你可以使用TABLE函数从中进行选择,但你使用的集合类型变得很重要。

为简短示例,这将创建一个数字表格的数据库类型:

CREATE TYPE number_tab AS TABLE OF NUMBER
/
  

已创建类型。

然后下一个块填充集合,并使用它作为表并将其连接到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);

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

希望这有帮助。

答案 1 :(得分:-1)

--Doesn't work.
--SELECT item BULK COLLECT AS 'mySelectedItems' INTO v_cids FROM table_one;

SELECT table_two.* 
FROM table_two INNER JOIN v_cids 
ON table_two.paramname = v_cids.mySelectedItems;

除非我误解了这个问题,否则这只会返回表变量中的结果。

注意:我从未使用过Oracle,但我认为这种情况会是一样的。