Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从plsql函数返回的游标中进行选择_Sql_Oracle_Plsql_Cursor - Fatal编程技术网

如何从plsql函数返回的游标中进行选择

如何从plsql函数返回的游标中进行选择,sql,oracle,plsql,cursor,Sql,Oracle,Plsql,Cursor,我有一个返回游标的函数,我的包是这样的 函数SEDIRUNTIME(sede varchar2)返回系统参考光标 此光标仅返回一个值的x行数,例如: ROW1 - 34 ROW2 - 55 ROW3 - 56 ecc. ecc. 现在我有我这样选择 .. AND field in (select DBK_ENIN_REPORT.*SEDIRUNTIME*(sede) from dual) 这将在中模拟一个子句,我们可以在运行时知道该子句的值 例如,基于location参数,光标可以

我有一个返回游标的函数,我的包是这样的

函数SEDIRUNTIME(sede varchar2)返回系统参考光标

此光标仅返回一个值的x行数,例如:

 ROW1 - 34
 ROW2 - 55
 ROW3 - 56  ecc. ecc.
现在我有我这样选择

.. AND field in  (select DBK_ENIN_REPORT.*SEDIRUNTIME*(sede) from dual)
这将在中模拟一个子句,我们可以在运行时知道该子句的值

例如,基于location参数,光标可以给我22和34,而不仅仅是56或78 98 09

写的,所以我不从错误号00932不一致的数据类型工作


解决方案?

您不能像那样使用
光标

但您可以更改函数以返回集合:

CREATE TYPE Numberlist IS TABLE OF NUMBER;
/

CREATE FUNCTION DBK_ENIN_REPORT.SEDIRUNTIME (
  sede varchar2
) return NumberList
IS
  out_numbers NumberList;
BEGIN
  SELECT id
  BULK COLLECT INTO out_numbers
  FROM   your_table;

  RETURN out_numbers;
END;
/
然后你可以做:

.. AND field MEMBER OF DBK_ENIN_REPORT.SEDIRUNTIME(sede)


您不能像那样使用
光标

但您可以更改函数以返回集合:

CREATE TYPE Numberlist IS TABLE OF NUMBER;
/

CREATE FUNCTION DBK_ENIN_REPORT.SEDIRUNTIME (
  sede varchar2
) return NumberList
IS
  out_numbers NumberList;
BEGIN
  SELECT id
  BULK COLLECT INTO out_numbers
  FROM   your_table;

  RETURN out_numbers;
END;
/
然后你可以做:

.. AND field MEMBER OF DBK_ENIN_REPORT.SEDIRUNTIME(sede)


嗯,我想说你可以做,但是你需要稍微扭曲一下。你可以看到我是如何做到的,如下所示。我以employee表为例

创建函数:

CREATE OR REPLACE FUNCTION SEDIRUNTIME (sede VARCHAR2)
   RETURN SYS_REFCURSOR
AS
   cur   SYS_REFCURSOR;
BEGIN
   OPEN cur FOR SELECT employee_id FROM employee;

   RETURN cur;
END;
/
可以在包中作为过程实现的匿名块

DECLARE
   x       SYS_REFCURSOR;
   y       NUMBER;
   v       VARCHAR2 (100);
   v_sql   VARCHAR2 (200);

   TYPE var_emp IS TABLE OF employee%ROWTYPE
      INDEX BY PLS_INTEGER;

   v_emp   var_emp;
BEGIN
   x := SEDIRUNTIME ('sede');

   LOOP
      FETCH x INTO y;

      v := v || ',' || y;

      EXIT WHEN x%NOTFOUND;
   END LOOP;
   --Created the IN clause list
   v := LTRIM (v, ',');

   v_sql := 'Select * from employee where employee_id in (' || v || ')';

   EXECUTE IMMEDIATE v_sql BULK COLLECT INTO v_emp;

   FOR i IN 1 .. v_emp.COUNT
   LOOP
      DBMS_OUTPUT.put_line ( v_emp (i).employee_id || '--' || v_emp (i).first_name);
   END LOOP;
END;
输出:

SQL> /
1--XXX
2--YYY

PL/SQL procedure successfully completed.

SQL> 

PS:当然,MTO提供的解决方案要比这快得多。

好吧,我想说你
可以
做到,但你需要
稍微扭转一下。你可以看到我是如何做到的,如下所示。我以employee表为例

创建函数:

CREATE OR REPLACE FUNCTION SEDIRUNTIME (sede VARCHAR2)
   RETURN SYS_REFCURSOR
AS
   cur   SYS_REFCURSOR;
BEGIN
   OPEN cur FOR SELECT employee_id FROM employee;

   RETURN cur;
END;
/
可以在包中作为过程实现的匿名块

DECLARE
   x       SYS_REFCURSOR;
   y       NUMBER;
   v       VARCHAR2 (100);
   v_sql   VARCHAR2 (200);

   TYPE var_emp IS TABLE OF employee%ROWTYPE
      INDEX BY PLS_INTEGER;

   v_emp   var_emp;
BEGIN
   x := SEDIRUNTIME ('sede');

   LOOP
      FETCH x INTO y;

      v := v || ',' || y;

      EXIT WHEN x%NOTFOUND;
   END LOOP;
   --Created the IN clause list
   v := LTRIM (v, ',');

   v_sql := 'Select * from employee where employee_id in (' || v || ')';

   EXECUTE IMMEDIATE v_sql BULK COLLECT INTO v_emp;

   FOR i IN 1 .. v_emp.COUNT
   LOOP
      DBMS_OUTPUT.put_line ( v_emp (i).employee_id || '--' || v_emp (i).first_name);
   END LOOP;
END;
输出:

SQL> /
1--XXX
2--YYY

PL/SQL procedure successfully completed.

SQL> 
PS:当然,MTO提供的解决方案要比这快得多。

另请参见,另请参见和