SQL 编译错误:无法评估不受支持的子查询类型 - SELECT 子句中的函数调用
Posted
技术标签:
【中文标题】SQL 编译错误:无法评估不受支持的子查询类型 - SELECT 子句中的函数调用【英文标题】:SQL compilation error: Unsupported subquery type cannot be evaluated - Function Calling in SELECT Clause 【发布时间】:2021-07-30 11:38:22 【问题描述】:-嗨,
我创建了一个标量函数,它在下面给出的 FROM 子句中有子查询。当从另一个视图的选择查询中调用此函数时,会引发错误
" SQL 编译错误:无法评估不支持的子查询类型 "
当我使用硬编码值传递时,它的工作和单选也工作正常。
create or replace function get_entry_value (p_element_type_id number, p_effective_date varchar,p_display_sequence number, p_element_entry_id number)
RETURNS table (meaning varchar)
as 'select meaning
from hr_lookups bb,
(select eev.screen_entry_value, inv.lookup_type, inv.element_type_id, eev.element_entry_id, inv.effective_start_date, inv.effective_end_date, eev.effective_start_date, eev.effective_end_date
from pay_element_entry_values_f eev,
pay_input_values_f inv
where P_ELEMENT_TYPE_ID = inv.element_type_id
and inv.display_sequence = P_DISPLAY_SEQUENCE
and eev.input_value_id = inv.input_value_id
and eev.element_entry_id = P_ELEMENT_ENTRY_ID
and P_EFFECTIVE_DATE between inv.effective_start_date and inv.effective_end_date
and P_EFFECTIVE_DATE between eev.effective_start_date and eev.effective_end_date ) aa
where bb.lookup_type = aa.screen_entry_value
and bb.lookup_code =aa.lookup_type';
调用视图的查询
select ele.assignment_id
, ele.element_entry_id
, ele.element_link_id
, etype.element_type_id
, ele.effective_start_date
, ele.effective_end_date
, ele.comment_id
, etype_tl.element_name
, etype_tl.description element_description
, pec_tl.classification_name
, decode(etype.processing_type, 'R','Recurring','N', 'Non Recurring','Not Specified'||etype.processing_type) Processing
, ele.creation_date Creation_date
, ele.last_update_date Update_Date
, get_pay_value_number(etype.element_type_id,ele.effective_start_date, ele.element_entry_id) Pay_Value
, get_input_value_name(etype.element_type_id,ele.effective_start_date,1) input_name1
--, get_entry_value(etype.element_type_id,ele.effective_start_date,1,ele.element_entry_id) input_value1
, get_entry_value_number(etype.element_type_id,ele.effective_start_date,1,ele.element_entry_id) input_value_num1
, get_input_value_name(etype.element_type_id,ele.effective_start_date,2) input_name2
--, get_entry_value(etype.element_type_id,ele.effective_start_date,2,ele.element_entry_id) input_value2
, get_entry_value_number(etype.element_type_id,ele.effective_start_date,2,ele.element_entry_id) input_value_num2
, get_input_value_name(etype.element_type_id,ele.effective_start_date,3) input_name3
--, get_entry_value(etype.element_type_id,ele.effective_start_date,3,ele.element_entry_id) input_value3
, get_entry_value_number(etype.element_type_id,ele.effective_start_date,3,ele.element_entry_id) input_value_num3
, get_input_value_name(etype.element_type_id,ele.effective_start_date,4) input_name4
--, get_entry_value(etype.element_type_id,ele.effective_start_date,4,ele.element_entry_id) input_value4
, get_entry_value_number(etype.element_type_id,ele.effective_start_date,4,ele.element_entry_id) input_value_num4
, get_input_value_name(etype.element_type_id,ele.effective_start_date,5) input_name5
--, get_entry_value(etype.element_type_id,ele.effective_start_date,5,ele.element_entry_id) input_value5
, get_entry_value_number(etype.element_type_id,ele.effective_start_date,5,ele.element_entry_id) input_value_num5
, get_input_value_name(etype.element_type_id,ele.effective_start_date,6) input_name6
--, get_entry_value(etype.element_type_id,ele.effective_start_date,6,ele.element_entry_id) input_value6
, get_entry_value_number(etype.element_type_id,ele.effective_start_date,6,ele.element_entry_id) input_value_num6
, get_input_value_name(etype.element_type_id,ele.effective_start_date,7) input_name7
--, get_entry_value(etype.element_type_id,ele.effective_start_date,7,ele.element_entry_id) input_value7
, get_entry_value_number(etype.element_type_id,ele.effective_start_date,7,ele.element_entry_id) input_value_num7
, get_input_value_name(etype.element_type_id,ele.effective_start_date,8) input_name8
--, get_entry_value(etype.element_type_id,ele.effective_start_date,8,ele.element_entry_id) input_value8
, get_entry_value_number(etype.element_type_id,ele.effective_start_date,8,ele.element_entry_id) input_value_num8
, get_input_value_name(etype.element_type_id,ele.effective_start_date,9) input_name9
--, get_entry_value(etype.element_type_id,ele.effective_start_date,9,ele.element_entry_id) input_value9
, get_entry_value_number(etype.element_type_id,ele.effective_start_date,9,ele.element_entry_id) input_value_num9
, get_input_value_name(etype.element_type_id,ele.effective_start_date,10) input_name10
--, get_entry_value(etype.element_type_id,ele.effective_start_date,10,ele.element_entry_id) input_value10
, get_entry_value_number(etype.element_type_id,ele.effective_start_date,10,ele.element_entry_id) input_value_num10
, get_input_value_name(etype.element_type_id,ele.effective_start_date,11) input_name11
--, get_entry_value(etype.element_type_id,ele.effective_start_date,11,ele.element_entry_id) input_value11
, get_entry_value_number(etype.element_type_id,ele.effective_start_date,11,ele.element_entry_id) input_value_num11
, get_input_value_name(etype.element_type_id,ele.effective_start_date,12) input_name12
--, get_entry_value(etype.element_type_id,ele.effective_start_date,12,ele.element_entry_id) input_value12
, get_entry_value_number(etype.element_type_id,ele.effective_start_date,12,ele.element_entry_id) input_value_num12
, get_input_value_name(etype.element_type_id,ele.effective_start_date,13) input_name13
, get_entry_value(etype.element_type_id,ele.effective_start_date,13,ele.element_entry_id) input_value13
, get_entry_value_number(etype.element_type_id,ele.effective_start_date,13,ele.element_entry_id) input_value_num13
, get_input_value_name(etype.element_type_id,ele.effective_start_date,14) input_name14
--, get_entry_value(etype.element_type_id,ele.effective_start_date,14,ele.element_entry_id) input_value14
, get_entry_value_number(etype.element_type_id,ele.effective_start_date,14,ele.element_entry_id) input_value_num14
, get_input_value_name(etype.element_type_id,ele.effective_start_date,15) input_name15
--, get_entry_value(etype.element_type_id,ele.effective_start_date,15,ele.element_entry_id) input_value15
, get_entry_value_number(etype.element_type_id,ele.effective_start_date,15,ele.element_entry_id) input_value_num15
from HR_ORA_PERSONAL_SCH.pay_element_classifications_tl pec_tl
, HR_ORA_PERSONAL_SCH.pay_element_classifications pec
, HR_ORA_PERSONAL_SCH.pay_element_types_f_tl etype_tl
, HR_ORA_PERSONAL_SCH.pay_element_types_f etype
, HR_ORA_PERSONAL_SCH.pay_element_links_f link
, HR_ORA_PERSONAL_SCH.pay_element_entries_f ele
where ele.element_link_id = link.element_link_id
and etype.element_type_id = link.element_type_id
and etype.element_type_id = etype_tl.element_type_id
and etype_tl.language = 'US'
and etype.classification_id = pec.classification_id
and pec.classification_id = pec_tl.classification_id
and pec_tl.language = 'US';
表定义
pay_element_entry_values_f
ELEMENT_ENTRY_VALUE_ID NUMBER(15,0)
EFFECTIVE_START_DATE DATE
EFFECTIVE_END_DATE DATE
INPUT_VALUE_ID NUMBER(9,0)
ELEMENT_ENTRY_ID NUMBER(15,0)
SCREEN_ENTRY_VALUE VARCHAR(60)
pay_input_values_f
INPUT_VALUE_ID NUMBER(9,0)
EFFECTIVE_START_DATE TIMESTAMP_NTZ(9)
EFFECTIVE_END_DATE TIMESTAMP_NTZ(9)
ELEMENT_TYPE_ID NUMBER(9,0)
LOOKUP_TYPE VARCHAR(30)
BUSINESS_GROUP_ID NUMBER(15,0)
LEGISLATION_CODE VARCHAR(30)
FORMULA_ID NUMBER(9,0)
DISPLAY_SEQUENCE NUMBER(5,0)
GENERATE_DB_ITEMS_FLAG VARCHAR(30)
HOT_DEFAULT_FLAG VARCHAR(30)
MANDATORY_FLAG VARCHAR(1)
NAME VARCHAR(80)
UOM VARCHAR(30)
DEFAULT_VALUE VARCHAR(60)
LEGISLATION_SUBGROUP VARCHAR(30)
MAX_VALUE VARCHAR(60)
MIN_VALUE VARCHAR(60)
WARNING_OR_ERROR VARCHAR(30)
LAST_UPDATE_DATE TIMESTAMP_NTZ(9)
LAST_UPDATED_BY NUMBER(15,0)
LAST_UPDATE_LOGIN NUMBER(15,0)
CREATED_BY NUMBER(15,0)
CREATION_DATE TIMESTAMP_NTZ(9)
OBJECT_VERSION_NUMBER NUMBER(9,0)
VALUE_SET_ID NUMBER(10,0)
【问题讨论】:
能否贴出子查询中使用的表定义? 【参考方案1】:您提供的信息很少,而且您的代码很混乱。但是,我可以看到您的函数 get_entry_value 被定义为表格函数 (UDTF)。这是故意的吗?如果是这样,那么您在调用视图中使用它不正确。表格函数像表格一样使用
select * from table(get_entry_value (p1, p2, p3, p4))
但在您的调用视图中,您将其用作标量函数 (UDF)。如果这是故意的,那么你需要修复你的函数,返回行应该是一个标量
RETURNS varchar
【讨论】:
【参考方案2】:sergiu,下面是我的表定义。
pay_element_entry_values_f
ELEMENT_ENTRY_VALUE_ID NUMBER(15,0) EFFECTIVE_START_DATE DATE EFFECTIVE_END_DATE DATE INPUT_VALUE_ID NUMBER(9,0) ELEMENT_ENTRY_ID NUMBER(15,0) SCREEN_ENTRY_VALUE VARCHAR(60)
pay_input_values_f
INPUT_VALUE_ID NUMBER(9,0) EFFECTIVE_START_DATE TIMESTAMP_NTZ(9) EFFECTIVE_END_DATE TIMESTAMP_NTZ(9) ELEMENT_TYPE_ID NUMBER(9,0) LOOKUP_TYPE VARCHAR(30) BUSINESS_GROUP_ID NUMBER(15,0) LEGISLATION_CODE VARCHAR(30) FORMULA_ID NUMBER(9,0) DISPLAY_SEQUENCE NUMBER(5,0) GENERATE_DB_ITEMS_FLAG VARCHAR(30) HOT_DEFAULT_FLAG VARCHAR(30) MANDATORY_FLAG VARCHAR(1) NAME VARCHAR(80) UOM VARCHAR(30) DEFAULT_VALUE VARCHAR(60) LEGISLATION_SUBGROUP VARCHAR(30) MAX_VALUE VARCHAR(60) MIN_VALUE VARCHAR(60) WARNING_OR_ERROR VARCHAR(30) LAST_UPDATE_DATE TIMESTAMP_NTZ(9) LAST_UPDATED_BY NUMBER(15,0) LAST_UPDATE_LOGIN NUMBER(15,0) CREATED_BY NUMBER(15,0) CREATION_DATE TIMESTAMP_NTZ(9) OBJECT_VERSION_NUMBER NUMBER(9,0) VALUE_SET_ID NUMBER(10,0)
【讨论】:
【参考方案3】:是的,我已经从表格函数更改为标量函数,如下所示,这会引发相同的错误。
create or replace function get_entry_value (p_element_type_id number, p_effective_date varchar,p_display_sequence number, p_element_entry_id number)
RETURNS varchar
as 'select meaning
from hr_lookups bb,
(select eev.screen_entry_value, inv.lookup_type, inv.element_type_id, eev.element_entry_id, inv.effective_start_date, inv.effective_end_date,
eev.effective_start_date, eev.effective_end_date
from pay_element_entry_values_f eev,
pay_input_values_f inv
where P_ELEMENT_TYPE_ID = inv.element_type_id
and inv.display_sequence = P_DISPLAY_SEQUENCE
and eev.input_value_id = inv.input_value_id
and eev.element_entry_id = P_ELEMENT_ENTRY_ID
and P_EFFECTIVE_DATE between inv.effective_start_date and inv.effective_end_date
and P_EFFECTIVE_DATE between eev.effective_start_date and eev.effective_end_date ) aa
where bb.lookup_type = aa.screen_entry_value
and bb.lookup_code =aa.lookup_type';
【讨论】:
以上是关于SQL 编译错误:无法评估不受支持的子查询类型 - SELECT 子句中的函数调用的主要内容,如果未能解决你的问题,请参考以下文章