我的要求是从中检查 当月的第一个日期即 01/12/2010与表中的名称 格式suresh_20101201存在于 数据库,如果没有那么它应该检查 对于表suresh_20101202及其上 直到suresh_20101231。可能吗 在oracle sql查询中做。
例如
select object_name from all_objects where object_type ='TABLE'
and upper(object_name) = 'SURESH_' || to_char(TRUNC(SYSDATE, 'mm'),'YYYYMMDD')
and ROWNUM =1
如果从dec的01到29日没有表,则上述查询应该运行到最后一天。
答案 0 :(得分:2)
您可以创建一个方便的视图,例如:
CREATE OR REPLACE VIEW ALL_SURESH_TABLES AS
SELECT
table_name,
to_date(regexp_replace(table_name, 'SURESH_([[:digit:]]+)', '\1'), 'YYYYMMDD')
AS table_date
FROM
ALL_TABLES
WHERE
regexp_like(table_name, 'SURESH_[[:digit:]]+')
然后像这样查询:
SELECT
MAX(table_name) KEEP (DENSE_RANK LAST ORDER BY table_date)
FROM
ALL_SURESH_TABLES
WHERE
TRUNC(table_date, 'mm') = TRUNC(SYSDATE, 'mm')
(我没有验证第二个查询,但是一旦创建ALL_SURESH_TABLES
视图就应该直接查询)
修改:根据您对“ORA-01830”错误的评论,我认为您至少有一个名称以SURESH_
开头的表格,以...结尾数字,但这些数字不构成有效日期。例如,这会导致出现相同的错误:
/* Notice the "date" has nine digits instead of eight */
SELECT to_date('201012088', 'YYYYMMDD') FROM DUAL
因此,我建议你改变这个:
regexp_replace(table_name, 'SURESH_([[:digit:]]+)', '\1')
进入这个:
regexp_replace(table_name, 'SURESH_([[:digit:]]{8}).*', '\1')
修改后的正则表达式只会关注“SURESH_
”之后的前八位数。