没有功能将LONG格式转换为DATE

时间:2019-06-26 10:59:35

标签: oracle oracle12c oracle18c

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;

3 个答案:

答案 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