【发布时间】:2016-02-18 18:04:57
【问题描述】:
我想在一个过程中执行这个查询:
PROCEDURE ConvertNo ()
IS
CURSOR get IS
select *
from tab
where xx in (2,3,5,6);
..
..
我应该如何将这 2,3,5,6 的值传递给程序?
【问题讨论】:
-
@GarethD - 当然这些值可以作为数组传递。但是,OP 如何在他的查询中使用这些值?
我想在一个过程中执行这个查询:
PROCEDURE ConvertNo ()
IS
CURSOR get IS
select *
from tab
where xx in (2,3,5,6);
..
..
我应该如何将这 2,3,5,6 的值传递给程序?
【问题讨论】:
您可以传递一个数字数组,然后在查询中使用该数组。为了能够在 SQL 中使用数组。该数组的类型必须存在于您的架构中,因此您需要创建一个新的数据库类型——如果它不存在的话——:
CREATE TYPE t_number IS TABLE OF NUMBER;
然后您可以将一个数字数组传递给您的过程并使用该数组,就好像它只是具有 TABLE 函数的另一个数据库表:
CREATE OR REPLACE PROCEDURE ConvertNo (p_numbers IN t_number) IS
CURSOR get IS
SELECT *
FROM tab
WHERE xx IN (SELECT column_value FROM TABLE(p_numbers));
...
BEGIN
...
END;
你可以这样调用这个过程:
DECLARE
v_numbers t_number := t_number(2,3,5,6);
BEGIN
ConvertNo(v_numbers);
...
END;
或者,您可以使用预定义类型 sys.odciNumberList 而不是创建新类型。
【讨论】:
sys.odciNumberList,如果您愿意,可以使用。