Как вы конвертируете данные LONG в TIMESTAMP или VARCHAR2? - PullRequest
4 голосов
/ 10 марта 2012

Мне нужно что-то вроде:

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_VALUE FROM 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_VALUE или to_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;

Ответы [ 3 ]

6 голосов
/ 10 марта 2012

Единственный способ конвертировать столбцы 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, а затем выбираете столбец INTO переменной.Наконец, это вывод для пользователя.SET SERVEROUTPUT ON SIZE 10000 позволяет спулингу из PUT_LINE перейти на экран.

Вы можете использовать аналогичный метод для выбора LONG в поле varchar.В следующем примере первые 2000 символов помещаются в TABLE_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;
1 голос
/ 11 марта 2012

Также возможно сделать следующее:

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, вы можете делать с ним все, что захотите.

Надеюсь, это поможет.

0 голосов
/ 16 ноября 2018

Есть хороший трюк, чтобы сделать это с помощью динамического SQL (EXECUTE IMMEDIATE)

SET SERVEROUTPUT ON
DECLARE
     l_date   DATE;
BEGIN
     FOR r IN (
          SELECT partition_name,high_value
            FROM user_tab_partitions
          WHERE table_name = 'MYTABLE'
     ) LOOP
          EXECUTE IMMEDIATE 'BEGIN :v := ' || r.high_value || '; END;' 
             USING  OUT l_date;
          DBMS_OUTPUT.PUT_LINE(r.partition_name||','|| l_date);
     END LOOP;
END;
/

Это производит вывод вида

SYS_P601452,19-10-18  --(partition_name,high_value)
SYS_P601451,18-10-18
SYS_P601453,20-10-18
SYS_P601454,21-10-18
SYS_P601455,22-10-18
..
..

Здесь я использовал секционированный столбец типа DATE. Вы можете использовать TIMESTAMP переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...