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 找不到该函数,很可能是因为您没有查看或执行它的权限,或者因为尚未创建该函数。