2012-03-10 253 views
4

我需要这样的东西:如何将LONG数据转换为TIMESTAMP或VARCHAR2?

SELECT PARTITION_NAME, 
     to_char(LONG_TO_TIMESTAMP(HIGH_VALUE), 'MM/DD/YYYY HH24:MI:SS') AS HIGH_VAL 
    FROM USER_TAB_PARTITIONS 
WHERE TABLE_NAME = 'TABLE_NAME' 

输出应该是这个样子:

PARTITION_NAME   HIGH_VAL 
---------------- -------------------- 
SOME_NAME   01/01/2010 00:00:00

当我运行:

SELECT PARTITION_NAME,HIGH_值与USER_TAB_PARTITIONS

它看起来像:

PARTITION_NAME   HIGH_VAL 
---------------- -------------------- 
SOME_NAME   TIMESTAMP' 2010-01-01 00:00:00'

如果我使用UTL_RAW.CAST_TO_VARCHAR2(HIGH_VALUE)
我最终得到一个ORA-00997: illegal use of LONG datatype错误。

如果我使用''||HIGH_VALUEto_clob(HIGH_VALUE)to_char(HIGH_VALUE)
我得到一个ORA-00932: inconsistent datatypes: expected [DATA_TYPE] got LONG错误

我的工作职能感谢尚美学园:

CREATE OR REPLACE FUNCTION GET_HIGH_VALUE_AS_DATE (
    p_TableName  IN VARCHAR2, 
    p_PatitionName IN VARCHAR2 
) RETURN DATE 
IS 
    v_LongVal LONG; 
BEGIN 
    SELECT HIGH_VALUE INTO v_LongVal 
     FROM USER_TAB_PARTITIONS 
    WHERE TABLE_NAME = p_TableName 
     AND PARTITION_NAME = p_PatitionName; 

    RETURN TO_DATE(substr(v_LongVal, 11, 19), 'YYYY-MM-DD HH24:MI:SS'); 
END GET_HIGH_VALUE_AS_DATE; 

SQL貌似

SELECT PARTITION_NAME, GET_HIGH_VALUE_AS_DATE(TABLE_NAME, PARTITION_NAME) 
    FROM USER_TAB_PARTITIONS 
WHERE TABLE_NAME LIKE 'TABLE_NAME' 
    AND ROWNUM < 2; 

回答

6

转换LONG列的唯一方法是在PL/SQL中。请看下面的例子中,它决定了LONG字段的长度:

SET SERVEROUTPUT ON SIZE 10000; 
DECLARE 
long_var LONG; 
BEGIN 
SELECT text_column INTO long_var 
FROM table_with_long 
WHERE rownum < 2; 
DBMS_OUTPUT.PUT_LINE('The length is '||LENGTH(long_var)); 
END; 

基本上,你定义一个变量为LONG类型,然后选择到变量的列。最后,它被输出给用户。 SET SERVEROUTPUT ON SIZE 10000允许从PUT_LINE后台打印到屏幕。

您可以使用类似的方法将LONG选择到varchar字段中。下面的例子将第2000个字符到表-B,这对于我们来说有一列,TEXT_FIELD:

DECLARE 
    long_var LONG; 
    var_var VARCHAR2(2000); 
    BEGIN 
    SELECT text_column INTO long_var 
    FROM table_with_long 
    WHERE rownum < 2; 
    var_var := substr(long_var,1,2000); 
    INSERT INTO table_b 
    VALUES (var_var); 
    END; 
+0

@scrapy做到了这一点... – shofee 2012-03-10 05:03:07

1

也有可能做到以下几点:

CREATE TABLE long_to_clob 
(partition_name VARCHAR2(30) 
, high_value_clob CLOB 
, high_value_text VARCHAR2(4000) 
); 

INSERT INTO long_to_clob (partition_name, high_value_clob) 
SELECT partition_name, TO_LOB(high_value) 
    FROM user_tab_partitions; 

UPDATE long_to_clob 
    SET high_value_text = DBMS_LOB.SUBSTR(high_value_clob, 1, 4000); 

使用唯一需要注意的TO_LOB是它必须在上面的INSERT语句中使用。另一方面,使用DBMS_LOB包的限制更少。显然,一旦你在VARCHAR2列中获得了值,你可以用它做任何你想做的事情。

希望这会有所帮助。