如何使一个选择从从PLSQL函数ORACLE
问题描述:
我有返回游标我的包是这样如何使一个选择从从PLSQL函数ORACLE
FUNCTION SEDIRUNTIME (sede varchar2) return SYS_REFCURSOR
此光标返回X仅用一个号码行的函数返回一个指针值,例如:
ROW1 - 34
ROW2 - 55
ROW3 - 56 ecc. ecc.
现在我有我选择这样
.. AND field in (select DBK_ENIN_REPORT.*SEDIRUNTIME*(sede) from dual)
这将模拟子句IN我们可以在运行时知道这些值。
例如,基于位置的参数,光标可以给我22和34,而不是仅仅56或78 98 09.
写入,所以我不从错误编号00932不相干数据类型工作。
解决方案?
答
嗯,我会说你CAN
做但你需要twist
一点点。你可以看到我如何做到如下。我以雇员表为例。
创建功能:
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;
OUTPUT:
SQL>/
1--XXX
2--YYY
PL/SQL procedure successfully completed.
SQL>
PS:Ofcourse通过MTO提供的解决方案将是更快,这。
答
你不能使用这样的CURSOR
。
但你可以改变函数返回一个集合:
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)
或
.. AND field IN (SELECT COLUMN_VALUE FROM TABLE(DBK_ENIN_REPORT.SEDIRUNTIME(sede)))
另请参阅https://stackoverflow.com/questions/18035778/select-data-from-cursor-of-package-print-it和https://stackoverflow.com/questions/20415107/how-to-fetch -Oracle参考光标 - 进入 - 表可变 – MT0