列HIGH_VALUE
的数据与下面类似,类型为LONG
,并且长度始终相同:
TIMESTAMP' 2019-01-30 00:00:00'
如何在不使用函数的情况下将其转换为DATE
类型?
我的总体目标是创建一个结果集,然后将其用作其他聚合的内部查询。例如,我希望能够根据将HIGH_VALUE
列转换为日期所产生的日期,对一年中的行数求和。
我仅对此数据库具有读取权限,因此无法创建函数。我在StackOverflow和其他站点上看到了其他解决方案,但是它们都需要创建一个函数。
ALL_TAB_PARTITIONS
是标准的内置Oracle表,因此我不包括表结构。如果出现问题,请告诉我,我将创建一个示例表。
一个示例查询和该查询产生的数据行如下。请注意,我无法在此数据库上创建表,因此,我还需要一种无需创建临时表即可工作的方法。
Insert into EXPORT_TABLE (TABLE_OWNER,TABLE_NAME,PARTITION_NAME,HIGH_VALUE,NUM_ROWS)
VALUES ('TO','TN','SYS_P201709','TIMESTAMP'' 2019-01-30 00:00:00''',5053133);
SELECT TABLE_OWNER, TABLE_NAME, PARTITION_NAME, HIGH_VALUE, NUM_ROWS
from ALL_TAB_PARTITIONS;
答案 0 :(得分:4)
如果您使用的是Oracle 12c,则仍可以使用函数,但可以内联定义:
List<WebElement> PMPageCMList = driver.findElements(By.xpath("//*[@id='collapseCM']/div[2]/div[2]/div"));
int totalcms = PMPageCMList.size();
for(int i=1;i<=totalcms;i++){
CaseManagersreceivingreminders.add(driver.findElement(By.xpath("//*[@id='collapseCM']/div[2]/div[2]/div"+"["+i+"]"+"/span")).getText());
System.out.println(CaseManagersreceivingreminders);
}
相关:WITH Clause Enhancements in Oracle Database 12c Release 1 (12.1)
答案 1 :(得分:2)
要将LONG
类型(HIGH_VALUE
)转换为TIMESTAMP
,
一种选择是使用动态sql并通过匿名块执行插入。不需要任何过程或功能。
DECLARE
tstamp TIMESTAMP;
BEGIN
FOR rec IN ( SELECT table_owner,table_name,partition_name,high_value,num_rows
FROM all_tab_partitions
WHERE ROWNUM < 5
) LOOP
EXECUTE IMMEDIATE 'BEGIN :dt := '
|| rec.high_value
|| '; END;'
USING OUT tstamp; --assign the long to an external timestamp variable
INSERT INTO export_table (
table_owner,table_name,partition_name,high_value,num_rows
) VALUES (rec.table_owner,
rec.table_name, rec.partition_name, tstamp, rec.num_rows
);
END LOOP;
END;
/
@ @APC评论说,还有一个solution using Pure SQL, 使用稍微复杂的Xml表达式。
答案 2 :(得分:1)
将pure SQL solution中的APC's comment与Oracle 12中的增强功能相结合,以允许在WITH
子句和Kaushik Nayak's method of using EXECUTE IMMEDIATE
to convert the string value to a date子句中声明函数,那么您可以得到:
Oracle设置-测试表和数据:
CREATE TABLE EXPORT_TABLE (
TABLE_OWNER VARCHAR2(30),
TABLE_NAME VARCHAR2(30),
PARTITION_NAME VARCHAR2(30),
HIGH_VALUE LONG,
NUM_ROWS INTEGER
);
INSERT INTO EXPORT_TABLE VALUES ( 'TO', 'TN', 'PN', 'TIMESTAMP ''2019-06-26 12:34:56''', 12345 );
查询:
WITH FUNCTION clobToDate( value IN CLOB ) RETURN DATE
IS
ts DATE;
BEGIN
EXECUTE IMMEDIATE 'BEGIN :ts := ' || value || '; END;' USING OUT ts;
RETURN ts;
END;
SELECT TABLE_OWNER,
TABLE_NAME,
PARTITION_NAME,
clobToDate(
EXTRACTVALUE(
dbms_xmlgen.getxmltype(
'SELECT high_value'
|| ' FROM EXPORT_TABLE'
|| ' WHERE TABLE_OWNER = ''' || t.table_owner || ''''
|| ' AND TABLE_NAME = ''' || t.table_name || ''''
|| ' AND PARTITION_NAME = ''' || t.partition_name || ''''
),
'//text()'
)
) AS HIGH_VALUE,
NUM_ROWS
FROM EXPORT_TABLE t;
输出:
TABLE_OWNER | TABLE_NAME | PARTITION_NAME | HIGH_VALUE | NUM_ROWS :---------- | :--------- | :------------- | :------------------ | -------: TO | TN | PN | 2019-06-26 12:34:56 | 12345
db <>提琴here
更新:如果要汇总某些列,则:
WITH FUNCTION clobToDate( value IN CLOB ) RETURN DATE
IS
ts DATE;
BEGIN
EXECUTE IMMEDIATE 'BEGIN :ts := ' || value || '; END;' USING OUT ts;
RETURN ts;
END;
SELECT table_owner,
table_name,
MAX( high_value ) AS max_high_value,
SUM( num_rows ) AS total_rows
FROM (
SELECT TABLE_OWNER,
TABLE_NAME,
PARTITION_NAME,
clobToDate(
EXTRACTVALUE(
dbms_xmlgen.getxmltype(
'SELECT high_value'
|| ' FROM EXPORT_TABLE'
|| ' WHERE TABLE_OWNER = ''' || t.table_owner || ''''
|| ' AND TABLE_NAME = ''' || t.table_name || ''''
|| ' AND PARTITION_NAME = ''' || t.partition_name || ''''
),
'//text()'
)
) AS HIGH_VALUE,
NUM_ROWS
FROM EXPORT_TABLE t
)
GROUP BY table_owner, table_name;
db <>提琴here