这个SQL查询的PL / SQL等价物是什么:
SELECT * FROM table(OWNER.PACKAGE.get_exam('123456789'));
这是我试图调用的函数:
FUNCTION get_exam(id IN VARCHAR2)
RETURN ab_assign_v1
IS
CURSOR c_exams(cid VARCHAR2) IS
SELECT t_api_exam_v1(
sei.person_id, --unique id
l.description --loc description
)
FROM my_view sei
JOIN loc l
ON sei.loc_code = l.loc_code
v_collection ab_assign_v1;
BEGIN
OPEN c_exams(id);
FETCH c_exams BULK COLLECT INTO v_collection;
CLOSE c_exams;
RETURN v_collection;
EXCEPTION
WHEN OTHERS THEN
error_a1.raise_error(SQLCODE, SQLERRM);
END get_exam;
答案 0 :(得分:0)
假设您要返回函数的结果:
select owner.package.get_exam('123456789') from table
答案 1 :(得分:0)
希望这有帮助。
DECLARE
lv <COLLECTION_NAME>;
BEGIN
lv:= OWNER.PACKAGE.get_exam('123456789');
dbms_output.put_line(lv.COUNT);
END;
/
答案 2 :(得分:0)
您的函数返回嵌套表类型。你只需要声明一个该类型的变量,并像它是一个标量一样分配给它:
declare
l_coll your_collection_type;
begin
l_coll := OWNER.PACKAGE.get_exam('123456789');
end;
/
在此示例中,your_collection_type
是占位符,用于函数实际返回的任何对象。
“我收到此错误:PLS-00201:必须声明标识符'ab_assign_v1'”
ab_assign_v1
是您的函数使用的类型。从修订后的问题中发布的代码看来,类型与拥有该函数的包具有相同的模式。但是,您的原始伪代码会使用模式名称作为前缀。因此,将两个和两个放在一起,您需要修改变量声明以包含模式。 (如果你还没有这样做,你可能还需要在它上面执行EXECUTE。)
declare
l_coll OWNER.ab_assign_v1;
begin
l_coll := OWNER.PACKAGE.get_exam('123456789');
end;
/