验证Oracle列名称

验证Oracle列名称,第1张

概述在一个场景中,我们动态创建sql以在运行中创建临时表. table_name没有问题,因为它由我们决定,但是列名由不在我们控制中的源提供. 通常我们会使用以下查询检查列名: select ..where NOT REGEXP_LIKE (Column_Name_String,'^([a-zA-Z])[a-zA-Z0-9_]*$') OR Column_Name_String is NULL 在一个场景中,我们动态创建sql以在运行中创建临时表. table_name没有问题,因为它由我们决定,但是列名由不在我们控制中的源提供.

通常我们会使用以下查询检查列名:

select  ..where NOT REGEXP_liKE (Column_name_String,'^([a-zA-Z])[a-zA-Z0-9_]*$') OR Column_name_String is NulLOR Length(Column_name_String) > 30

但是,是否有任何功能可以进行更广泛的检查.此外,欢迎上述查询的任何输入.

提前致谢.

基于以下答案的最终查询:

select  ..where NOT REGEXP_liKE (Column_name_String,'^([a-zA-Z])[a-zA-Z0-9_]{0,29}$') OR Column_name_String is NulLOR Upper(Column_name_String) in (select Upper(RESERVED_WORDS.Keyword) from V$RESERVED_WORDS RESERVED_WORDS)

特别不满意像列名中的字符,因此不会使用..

dbms_assert.simple_sql_name('VALID_name')

相反,使用正则表达式,我可以决定允许自己的一组字符.

解决方法

” is there any build in function which can do a more extensive check.”

Oracle具有DBMS_ASSERT.SIMPLE_sql_name()函数.如果符合Oracle命名规则,则返回传递的名称

select dbms_assert.simple_sql_name('VALID_name') from dual;

…如果名称无效,请投掷ORA-44003.

有效名称允许任何字符,如果名称是双引号(yuck,但那么就是创建“临时表”).此功能也不会检查名称的长度,因此您仍需要自己验证.

Find out more in the docs.

这里也是a SQL Fiddle.

“creating a table with comment column is not possible as its a invalID IDentifIEr”

有道理. DBMS_ASSERT主要用于防止sql注入.因此,它验证值是否符合Oracle的命名规则,而不是该值是有效的Oracle名称.为了捕捉注释之类的内容,你还需要检查V$RESERVED_WORDS的值,可能是保留!=’Y’.由于这是一个V $视图,因此默认情况下不会授予它;如果您无法访问,则需要请求友好的DBA提供帮助.

” For valIDating column names I belIEve I should check with the entire List”

由你决定.区别在于某些关键字可以合法地用作标识符.例如,当TYPE引入对象关系的东西时,它只成为Oracle版本8中的保留字.但是现有系统中有很多表和视图使用’TYPE’作为列名(尤其是Oracle数据字典).如果Oracle使TYPE成为一个适当保留的单词,那么它将破坏所有这些系统.因此,不能用作标识符的保留字列表是所有Oracle关键字的子集.

关于一般任务的意见:

“we are getting data from external sources (files) and the job of the program/script is to push that data to oracle tables.”

这项任务分为两部分.

首先,您应该与第三方商定这些文件的标准格式.不需要发现文件的结构或内容. (或者如果有这样的需要,因为文件是从第三方的轮播中随机获取的,你可能不应该使用关系数据库,而是其他东西:Endeca?Python Pandas库?)

第二个是动态创建表.如果您有一个商定的文件结构,那么您应该根据您的具体情况使用SQL*Loader或external tables加载到标准表中.如果你在12c,也许SQL*Loader Express Mode可能会有兴趣.

总结

以上是内存溢出为你收集整理的验证Oracle列名称全部内容,希望文章能够帮你解决验证Oracle列名称所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1157881.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存