【发布时间】:2018-01-04 07:11:56
【问题描述】:
在一种情况下,我们动态地为create 临时表创建sql。 table_name 没有问题,因为它是由我们决定的,但是列名是由不受我们控制的来源提供的。
通常我们会使用以下查询检查列名:
select ..
where NOT REGEXP_LIKE (Column_Name_String,'^([a-zA-Z])[a-zA-Z0-9_]*$')
OR Column_Name_String is NULL
OR 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 NULL
OR Upper(Column_Name_String) in (select Upper(RESERVED_WORDS.Keyword) from V$RESERVED_WORDS RESERVED_WORDS)
对列名中的 $ 等字符特别不满意,因此也不会使用..
dbms_assert.simple_sql_name('VALID_NAME')
我可以使用正则表达式来决定我自己的字符集是否允许。
【问题讨论】:
-
@TimBiegeleisen 只是试图选择所有无效的列。下面的检查句柄就是它。如果
no data found则向前移动否则error。 -
为什么要动态创建表?这在 Oracle 世界中并不常见(但据我所知,它在 MS SQL Server 中)。所以,如果你的主要背景是 SQL Server,也许你想解释一下你到底在做什么以及为什么;有人可能会为您指出正确(即更好)的方向。
-
@Littlefoot 好吧,我无法改变这个过程,但让我分享一点背景知识,以便我对未来有一些更好的想法(使用最佳实践)。目前我们正在从外部源(文件)获取数据,程序/脚本的工作是将这些数据推送到 oracle 表。尽管存在第三方应提供数据的某些规则,但他们有时会违反这些规则。例如,列是数字数据类型,但如果提供的数据是字符串,那么我的 data-push(sqlldr) 将失败....
-
@Littlefoot 为了验证数据,我们决定使用第三方提供的列和数据创建动态表并对其进行验证。通过这种方式,我们可以立即验证整组数据并提供错误。如果我们只依赖oracle,那么错误可能会随着异常的抛出而一个一个地抛出,并且会使错误修复任务变得非常繁琐。
-
@APC 请在上方查看。欣赏一些提示和建议。