SQL/PLSQL:这是(下面给出的)调用包体中包含的游标查询的“FROM 子句”内函数的正确方法吗:-

问题描述 投票:0回答:1
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
sql oracle-database plsql plsql-package
1个回答
0
投票

恐怕您无法使用问题中的内容动态声明光标。但是,还有另一种非常相似的方法可以做到这一点。

您可以在包函数内动态生成 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 - 将其作为参考游标打开并循环遍历它以完成您的工作。

问候...

© www.soinside.com 2019 - 2024. All rights reserved.