【发布时间】:2015-04-04 04:15:59
【问题描述】:
我需要检查某个SELECT语句是否包含表中不存在的字段(列),例如:
从 table1 中选择 col1、col2、col3
如果 col1 不存在,我想显示“缺失字段”,而不是让用户得到一个无效的标识符错误。
我最好的选择是什么?
【问题讨论】:
标签: oracle exception plsql dynamic-sql
我需要检查某个SELECT语句是否包含表中不存在的字段(列),例如:
从 table1 中选择 col1、col2、col3
如果 col1 不存在,我想显示“缺失字段”,而不是让用户得到一个无效的标识符错误。
我最好的选择是什么?
【问题讨论】:
标签: oracle exception plsql dynamic-sql
此代码片段应该可以帮助您入门:
set serveroutput on
DECLARE
exc_invalid_id EXCEPTION;
PRAGMA EXCEPTION_INIT(exc_invalid_id, -904);
l_message VARCHAR2(4000);
BEGIN
EXECUTE IMMEDIATE '
SELECT col1
, col2
, col3
FROM table1
';
EXCEPTION
WHEN exc_invalid_id THEN
l_message := regexp_replace(sqlerrm, '^[A-Z]{3}-[0-9]{5}: "([^"]+)".*$', '\1');
dbms_output.put_line ( 'missing field '''||l_message||'''');
dbms_output.put_line ( 'exception: sqlcode='||SQLCODE||', sqlerrm='''||sqlerrm||'''');
WHEN OTHERS THEN
RAISE;
END;
/
show errors
解释:
00904。【讨论】:
试试:
select 1
from user_tab_columns
where table_name = '<your table name>' and
column_name = '<your column name>'
这仅适用于同一架构中的表。如果您需要其他模式,请替换为 ALL_TAB_COLUMNS 视图。如果没有返回行,则不存在列。我假设这是针对动态 SQL 的,因为对于静态 SQL,如果该列仍然丢失,则会出现编译错误。
【讨论】: