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 子句中的函数调用的主要内容,如果未能解决你的问题,请参考以下文章

雪花:无法评估不受支持的子查询类型

无法从函数评估不受支持的子查询类型

替换雪花中的子查询

Snowflake 中的返回类型“Table”问题

雪花标量 UDF 返回 无法评估不支持的子查询类型

雪花不支持的子查询类型无法在 UDF 标量中评估