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
恐怕您无法使用问题中的内容动态声明光标。但是,还有另一种非常相似的方法可以做到这一点。
您可以在包函数内动态生成 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 - 将其作为参考游标打开并循环遍历它以完成您的工作。
问候...