PL / SQL等效于SELECT语句

时间:2017-08-18 05:03:37

标签: sql oracle plsql

这个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;

3 个答案:

答案 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;
/