SQL/PLSQL:这是在包体中包含的游标查询的‘FROM子句’内调用函数的正确方式吗?

lztngnrs  于 2022-10-04  发布在  Oracle
关注(0)|答案(1)|浏览(89)
CURSOR recipe_attributes_cur(p_recipe_id IN recipe_data.recipe_id%TYPE) IS    

SELECT t.attribute_name, t.attribute_value,
     CASE
         WHEN ra.enum_list IS NOT NULL 
         THEN (SELECT choice_str
                 FROM recipe_enums_v
                WHERE enum_list = ra.enum_list
                  AND choice_id = rd.recipe_value_num)
         ELSE TO_CHAR (NULL)
       END AS enum_value,
       ra.datatype_id

***FROM table(acls_recipe.get_sic_attributes_value(p_recipe_id)) t***, recipe_attributes ra

where ra.attribute_name = t.attribute_name
order by  ra.attribute_id --t.attribute_name

UNION ALL
kb5ga3dv

kb5ga3dv1#

恐怕您不能使用您问题中的内容来动态声明光标。但是,还有一种非常类似的方法可以做到这一点。
您可以在包函数中动态生成Select语句,并将该语句用作引用游标。下面是一个简单的CMOD包中的testf2()函数示例:

FUNCTION testf2 (mWhat IN VarChar2) RETURN VarChar2 IS
    mySQL VarChar2(512);
    sq VarChar(1) := '''';  -- this is a single-quote character for mySQL string

    Begin
        mySQL := 'Select ' || sq || 'A' || sq || ' "A_LETTER", 1 "A_NUMBER" From ' || mWhat;
        RETURN mySQL;
    End testf2;

此函数接受VarChar2参数(可以是生成SQL所需的任何内容),并返回生成的Select语句。如果参数为‘DUAL’,则函数将返回...

Select 'A' "A_LETTER", 1 "A_NUMBER" From DUAL

现在,为了使其正常工作,获取该函数生成的Select语句并将其用作引用游标…

SET SERVEROUTPUT ON
Declare
    c SYS_REFCURSOR;
    mySQL VarChar2(512) := CMOD.testf2('DUAL');
    c_letter VarChar2(1);
    c_number Number(1);
Begin 
    DBMS_OUTPUT.PUT_LINE(mySQL)
    --
    OPEN c FOR mySQL;
    FETCH c InTo c_letter, c_number;
    --
    DBMS_OUTPUT.PUT_LINE(c_letter || To_Char(c_number));
End;

--  R e s u l t :
--  anonymous block completed
--  Select 'A' "A_LETTER", 1 "A_NUMBER" From DUAL
--  A1

这样,您就可以生成您自己的SQL--将其作为引用游标打开并循环通过它来完成您的工作。
致敬..。

相关问题