这可能会觉得有点傻,但我想知道这是否是可能的。
我有返回SYS_REFCURSOR功能
CREATE OR REPLACE FUNCTION get_employee_details(p_emp_no IN EMP.EMPNO%TYPE)
RETURN SYS_REFCURSOR
AS
o_cursor SYS_REFCURSOR;
BEGIN
OPEN o_cursor FOR
SELECT EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO
FROM emp
WHERE EMPNO = p_emp_no;
RETURN o_cursor;
-- exception part
END;
/
我可以用得到的结果
select get_employee_details('7369') from dual;
是否有可能通过指定列名从上面的功能得到结果? 例如,如果我想获得的ename和薪水,我怎么能在SQL语句中指定,而无需使用PLSQL块? 就像是
select get_employee_details('7369') <specific column> from dual;
不,不与ref cursor
可言,否则没有创建SQL类型转换返回到,像这样的例子: http://dbaspot.com/oracle-server/9308-select-ref-cursor.html :
create or replace type myType as object (
a int,
b varchar2(10)
)
/
create or replace type myTable as table of myType;
/
create or replace function f1 return myTable as
l_data myTable := myTable();
begin
for i in 1 .. 5 loop
l_data.extend;
l_data(i) := myType(i, 'Row #'||i );
end loop;
return l_data;
end;
/
select * from TABLE ( cast( f1() as myTable ) );
---------- ----------
1 Row #1
2 Row #2
3 Row #3
4 Row #4
5 Row #5
从那个线程最后发表的文章:
你已经知道了大概的方式是使用REF CURSOR在select语句的唯一一个。
为了这个目的,你可能想看看PIPELINED
功能。 你必须在PL / SQL水平虽然声明明确的类型。 这部分将设置输出列名:
CREATE OR REPLACE TYPE my_rec AS OBJECT (
c CHAR,
n NUMBER(1)
);
CREATE OR REPLACE TYPE my_tbl AS TABLE OF my_rec;
现在,最大的优点是,你不仅可以“重命名”你的专栏,但修改从光标记录上飞了。 对于例如:
CREATE OR REPLACE FUNCTION my_fct
RETURN my_tbl PIPELINED
AS
-- dummy data - use your own cursor here
CURSOR data IS
SELECT 'a' as A, 1 AS B FROM DUAL UNION
SELECT 'b', 2 FROM DUAL UNION
SELECT 'c', 3 FROM DUAL UNION
SELECT 'd', 4 FROM DUAL;
BEGIN
FOR the_row IN data
LOOP
PIPE ROW(my_rec(the_row.a, the_row.b*2));
-- ^^
-- Change data on the fly
END LOOP;
END
用法:
SELECT * FROM TABLE(my_fct())
-- ^^^^^^^^^^^^^^^
-- Use this "virtual" table like any
-- other table. Supporting `WHERE` clause
-- or any other SELECT clause you want
生产:
C N
a 2
b 4
c 6
d 8