传递一个数组来运行并在WHERE IN子句中使用它

时间:2014-12-27 10:04:27

标签: arrays oracle plsql

我想在Where in子句

下使用数组(传递给函数)

以下是我尝试的内容

首先创建数组类型

 create or replace type p_emp_arr as table of number   

功能

 create or replace
    FUNCTION getEmployee_func ( empId_arr IN p_emp_arr)
    RETURN number IS
       total number(2) := 0;

      BEGIN 

  IF(empId_arr is null)   
   THEN
    empIdClause := '';
   ELSE
      empIdClause := 'AND Employee.empId in (select column_value from table('||empId_arr||'))'; 
  END IF;

        ....
        RETURN total;
     END;

但是给出错误

 Error(17,23): PLS-00306: wrong number or types of arguments in call to '||'

1 个答案:

答案 0 :(得分:1)

错误是因为CONCAT (||)运算符只接受标量变量(字符串/数字),因此无法将数组传递给它。

您需要将其作为动态PL / SQL块执行。

如果你想动态绑定数组,请尝试这样的事情 适当地使用INOUT关键字绑定变量。

在您的匿名块字符串中,使用colon (:)

作为待绑定变量的前缀
EXECUTE IMMEDIATE '
  BEGIN
       SELECT
         COLUM1,COLUMN2..
       INTO
         :VAR1, :VAR2..
       FROM .... WHERE...
       AND Employee.empId in (select column_value from table(:empId_arr));
  END;
  '
  USING OUT VAR1, OUT VAR2... IN empId_arr;

它也可以是简单的,

OPEN EMP_CURSOR FOR
  'SELECT * FROM Employee 
      where empId in SELECT COLUMN_VALUE FROM TABLE(:empId_arr)'
   USING empId_arr ;

如果将输出作为光标;

AS Wernfried提到..使用MEMBER OF运算符。

OPEN EMP_CURSOR FOR
  'SELECT * FROM Employee 
      where empId member of :empId_arr'
   USING empId_arr ;