Oracle ORA-00904 error: invalid identifier
Oracle ORA-00904 error: invalid identifier
我对使用 Oracle 还很陌生。我运行一个程序更新一个table。该过程基本上使用 table 名称和列名称作为参数。
我得到一个 ORA-00904。我查看了错误消息并对其进行了研究,发现我传递的列名称可能不正确(可接受的值是:小于或等于 30 个字符/字母数字和特殊字符 $、_ 和 #)
我的错误信息是:
Error in UV_KVS_EXTRACT_VALIDATION, error: ORA-00904: "CIT_DW_ETL"."TO_NUMBER_VALIDATE": invalid identifier, sql= select distinct uv.FRM_TRACK_ID, uv.INST_NUM, uv.TPST_SRV_CONTACT_DTE uv_value, k.value kvs_value, 'KVS_EVENT_DATA' kvs_table, k.event_id kvs_id from IM_FORMS.FRM_2450_UV_mv uv join iidb_stg.fn_frm_track_mv frm on uv.FRM_TRACK_ID = frm.frm_track_id and frm.STS_CDE in ('AER','AIP','AUD','CMP','PND','QRY') join cit_udm.event e on uv.FRM_TRACK_ID = cit_dw_etl.to_number_validate(JSON_VALUE(e.sys_source_id, '$.ID1')) and uv.INST_NUM = cit_dw_etl.to_number_validate(JSON_VALUE(e.sys_source_id, '$.ID2')) join cit_udm.KVS_EVENT_DATA k on k.event_id = e.event_id where k.key = 'TPST_SRV_CONTACT_DTE'
例如,如果我按照上面的错误消息进行操作,对我来说,列名 TPST_SRV_CONTACT_DTE
似乎不正确。但它是字母数字 + 少于 30 个字符并且具有 _ 特殊字符。它遵循格式但失败了。
以下是可能失败的程序片段:
v_sql := 'select distinct uv.FRM_TRACK_ID, uv.INST_NUM, uv.' || v_uv_column || ' uv_value, '||
' k.value kvs_value, ''' || v_kvs_table || ''' kvs_table, k.' || case when v_kvs_table = 'KVS_EVENT_DATA' then 'event_id'
when v_kvs_table = 'KVS_PRODUCT_DATA' then 'product_id' end || ' kvs_id' ||
' from IM_FORMS.' || v_uv_table || '_mv uv' ||
' join iidb_stg.fn_frm_track_mv frm on uv.FRM_TRACK_ID = frm.frm_track_id and frm.STS_CDE in (''AER'',''AIP'',''AUD'',''CMP'',''PND'',''QRY'')' ||
case when v_kvs_table = 'KVS_EVENT_DATA' then
' join cit_udm.event e on uv.FRM_TRACK_ID = cit_dw_etl.to_number_validate(JSON_VALUE(e.sys_source_id, ''$.ID1'')) and uv.INST_NUM = cit_dw_etl.to_number_validate(JSON_VALUE(e.sys_source_id, ''$.ID2''))' ||
' join cit_udm.KVS_EVENT_DATA k on k.event_id = e.event_id where k.key = ''' || v_key || ''''
when v_kvs_table = 'KVS_PRODUCT_DATA' then
' join cit_udm.product p on uv.FRM_TRACK_ID = cit_dw_etl.to_number_validate(JSON_VALUE(p.sys_source_id, ''$.ID1'')) and uv.INST_NUM = cit_dw_etl.to_number_validate(JSON_VALUE(p.sys_source_id, ''$.ID2''))' ||
' join cit_udm.KVS_PRODUCT_DATA k on k.product_id = p.product_id where k.key = ''' || v_key || ''''
else ''
end
;
此 v_sql
在代码的下游使用。
我 90% 确定它与列的命名方式以及它可能发生的位置有关,但我不知道什么以及如何修复它。跟单引号改双引号有关系吗?
欢迎提出任何意见或建议。
谢谢。
我猜你的问题出在这部分kvs_value, 'KVS_EVENT_DATA' kvs_table,
。如果您删除 'KVS_EVENT_DATA'
那么它将起作用。我不知道你想在这里得到什么。
错误:ORA-00904:“CIT_DW_ETL”。“TO_NUMBER_VALIDATE”
cit_dw_etl.to_number_validate
是函数调用,这里:
v.FRM_TRACK_ID = cit_dw_etl.to_number_validate(JSON_VALUE(e.sys_source_id, '$.ID1'))
该错误表明 Oracle 找不到该函数,很可能是因为您没有查看或执行它的权限,或者因为尚未创建该函数。
我对使用 Oracle 还很陌生。我运行一个程序更新一个table。该过程基本上使用 table 名称和列名称作为参数。
我得到一个 ORA-00904。我查看了错误消息并对其进行了研究,发现我传递的列名称可能不正确(可接受的值是:小于或等于 30 个字符/字母数字和特殊字符 $、_ 和 #)
我的错误信息是:
Error in UV_KVS_EXTRACT_VALIDATION, error: ORA-00904: "CIT_DW_ETL"."TO_NUMBER_VALIDATE": invalid identifier, sql= select distinct uv.FRM_TRACK_ID, uv.INST_NUM, uv.TPST_SRV_CONTACT_DTE uv_value, k.value kvs_value, 'KVS_EVENT_DATA' kvs_table, k.event_id kvs_id from IM_FORMS.FRM_2450_UV_mv uv join iidb_stg.fn_frm_track_mv frm on uv.FRM_TRACK_ID = frm.frm_track_id and frm.STS_CDE in ('AER','AIP','AUD','CMP','PND','QRY') join cit_udm.event e on uv.FRM_TRACK_ID = cit_dw_etl.to_number_validate(JSON_VALUE(e.sys_source_id, '$.ID1')) and uv.INST_NUM = cit_dw_etl.to_number_validate(JSON_VALUE(e.sys_source_id, '$.ID2')) join cit_udm.KVS_EVENT_DATA k on k.event_id = e.event_id where k.key = 'TPST_SRV_CONTACT_DTE'
例如,如果我按照上面的错误消息进行操作,对我来说,列名 TPST_SRV_CONTACT_DTE
似乎不正确。但它是字母数字 + 少于 30 个字符并且具有 _ 特殊字符。它遵循格式但失败了。
以下是可能失败的程序片段:
v_sql := 'select distinct uv.FRM_TRACK_ID, uv.INST_NUM, uv.' || v_uv_column || ' uv_value, '||
' k.value kvs_value, ''' || v_kvs_table || ''' kvs_table, k.' || case when v_kvs_table = 'KVS_EVENT_DATA' then 'event_id'
when v_kvs_table = 'KVS_PRODUCT_DATA' then 'product_id' end || ' kvs_id' ||
' from IM_FORMS.' || v_uv_table || '_mv uv' ||
' join iidb_stg.fn_frm_track_mv frm on uv.FRM_TRACK_ID = frm.frm_track_id and frm.STS_CDE in (''AER'',''AIP'',''AUD'',''CMP'',''PND'',''QRY'')' ||
case when v_kvs_table = 'KVS_EVENT_DATA' then
' join cit_udm.event e on uv.FRM_TRACK_ID = cit_dw_etl.to_number_validate(JSON_VALUE(e.sys_source_id, ''$.ID1'')) and uv.INST_NUM = cit_dw_etl.to_number_validate(JSON_VALUE(e.sys_source_id, ''$.ID2''))' ||
' join cit_udm.KVS_EVENT_DATA k on k.event_id = e.event_id where k.key = ''' || v_key || ''''
when v_kvs_table = 'KVS_PRODUCT_DATA' then
' join cit_udm.product p on uv.FRM_TRACK_ID = cit_dw_etl.to_number_validate(JSON_VALUE(p.sys_source_id, ''$.ID1'')) and uv.INST_NUM = cit_dw_etl.to_number_validate(JSON_VALUE(p.sys_source_id, ''$.ID2''))' ||
' join cit_udm.KVS_PRODUCT_DATA k on k.product_id = p.product_id where k.key = ''' || v_key || ''''
else ''
end
;
此 v_sql
在代码的下游使用。
我 90% 确定它与列的命名方式以及它可能发生的位置有关,但我不知道什么以及如何修复它。跟单引号改双引号有关系吗?
欢迎提出任何意见或建议。
谢谢。
我猜你的问题出在这部分kvs_value, 'KVS_EVENT_DATA' kvs_table,
。如果您删除 'KVS_EVENT_DATA'
那么它将起作用。我不知道你想在这里得到什么。
错误:ORA-00904:“CIT_DW_ETL”。“TO_NUMBER_VALIDATE”
cit_dw_etl.to_number_validate
是函数调用,这里:
v.FRM_TRACK_ID = cit_dw_etl.to_number_validate(JSON_VALUE(e.sys_source_id, '$.ID1'))
该错误表明 Oracle 找不到该函数,很可能是因为您没有查看或执行它的权限,或者因为尚未创建该函数。