包体中游标查询FROM子句调用函数的写法是否正确?
关于游标中
TABLE(函数)用法的正确性判断 首先,你在游标FROM子句中使用TABLE(acls_recipe.get_sic_attributes_value(p_recipe_id))的语法本身是合法的,但这个写法能正常运行需要满足几个前提:
- 函数
acls_recipe.get_sic_attributes_value必须返回一个Oracle支持的集合类型(比如嵌套表、VARRAY),且该集合类型要能被SQL引擎识别:要么是用CREATE TYPE语句在数据库级别创建的顶层类型,要么是在包内定义的类型且当前游标所在的包有权访问它。 - 集合类型的元素结构要和你查询中引用的
t.attribute_name、t.attribute_value对应——比如如果是对象类型集合,对象必须包含这两个属性;如果是记录类型集合,记录要定义这两个字段,且该记录类型能被SQL识别。 - 函数参数
p_recipe_id的类型和游标传入的参数类型兼容,传递逻辑正确。
另外注意你提供的代码存在两个语法错误(和TABLE()函数用法无关):
- 查询中引用了
rd.recipe_value_num,但FROM子句里没有rd这个表或别名,会导致编译失败。 UNION ALL后面没有对应的第二个查询块,语法不完整。
内容的提问来源于stack exchange,提问作者Anshul Lavaniya
相关产品推荐
相关产品推荐

