Oracle SQL-使用可变参数选择存储过程

Oracle SQL-使用可变参数选择存储过程,sql,oracle,parameter-passing,Sql,Oracle,Parameter Passing,我正在处理一个变量参数存储过程,它必须使用WHERE子句中传递给它的每个参数对表执行SELECT 基本上,我有N个帐号作为参数,我想返回一个表,其中包含为每个帐号选择三个字段的结果 这就是我到目前为止所做的: function sp_get_minutes_expiration_default(retval IN OUT char, gc IN OUT GenericCursor, p_account_num IN CLIENT_ACCOUNTS.ACCOUNT_NUM%TYPE

我正在处理一个变量参数存储过程,它必须使用WHERE子句中传递给它的每个参数对表执行SELECT

基本上,我有N个帐号作为参数,我想返回一个表,其中包含为每个帐号选择三个字段的结果

这就是我到目前为止所做的:

function sp_get_minutes_expiration_default(retval IN OUT char, gc IN OUT GenericCursor,
        p_account_num IN CLIENT_ACCOUNTS.ACCOUNT_NUM%TYPE) return number
        is
    r_cod integer := 0;
    begin
        open gc for select account_num, concept_def, minutes_expiration_def from CLIENT_ACCOUNTS
            where p_account_num = account_num;  -- MAYBE A FOR LOOP HERE?
        return r_cod;
    exception

        -- EXCEPTION HANDLING

    end sp_get_minutes_expiration_default;

我的暴力解决方案可能是循环一个帐号列表,选择并可能执行联合或附加到结果表中?

如果将输入参数转换为表,则可以将其连接到客户端帐户

select account_num, concept_def, minutes_expiration_def
from CLIENT_ACCOUNTS ca, table(p_account_num) a
where a.account_num = ca.account_num
但我建议您将输出选择到另一个集合中,该集合是函数或过程的输出。我希望您不要使用引用游标

增编1

下面是一个更完整的示例:

create or replace type id_type_array as table of number;
/

declare
   ti id_type_array := id_type_array();
   n number;
begin
   ti.extend();
   ti(1) := 42;
   select column_value into n from table(ti) where rownum = 1;
end;
/
在代码中,您需要使用框架的API来:

创建类型id\u type\u数组集合的实例 用数字列表填充集合 执行匿名PL/SQL块,在集合中绑定 但是您应该立即看到,即使许多经验丰富的Oracle开发人员都支持查询,您也不必将查询放入匿名PL/SQL块来执行它。只要绑定了正确的参数,就可以像执行任何其他查询一样执行查询:

select account_num, concept_def, minutes_expiration_def
from CLIENT_ACCOUNTS ca, table(:p_account_num) a
where a.column_value = ca.account_num

@jeff5times7在这个简短的示例中,p_account_num应该是什么类型的,一个SQL列表??我一直在读关于TABLE函数的书,但我真的不明白它需要什么参数。请你再扩展一点好吗?请参见附录1。