Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将长数据转换为TIMESTAMP或VARCHAR2?_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql 如何将长数据转换为TIMESTAMP或VARCHAR2?

Sql 如何将长数据转换为TIMESTAMP或VARCHAR2?,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我需要这样的东西: 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 ---------------- -------------------- S

我需要这样的东西:

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,
       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 SQL看起来像

PARTITION_NAME HIGH_VAL ---------------- -------------------- SOME_NAME TIMESTAMP' 2010-01-01 00:00:00'
选择分区名称,获取高值作为日期(表名称、分区名称)
从用户\u选项卡\u分区
其中表名类似于“表名”
ROWNUM<2;

转换长列的唯一方法是使用PL/SQL。请看以下示例,它决定了长字段的长度:

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;
将SERVEROUTPUT设置为10000大小;
声明
龙(long_var long),;
开始
在长变量中选择文本列
从表_和_long
其中rownum<2;
DBMS_OUTPUT.PUT_LINE('长度为'| |长度(long_var));
结束;
基本上,将变量定义为LONG类型,然后将列选择到变量中。最后,它被输出给用户。将SERVEROUTPUT设置为大小10000允许从PUT_线到屏幕的假脱机

您可以使用类似的方法将LONG字段选择到varchar字段中。下面的示例将前2000个字符放入表_B中,表中有一列TEXT_FIELD:

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;
声明
龙(long_var long),;
var_var VARCHAR2(2000年);
开始
在长变量中选择文本列
从表_和_long
其中rownum<2;
var_var:=substr(long_var,12000);
插入到表b中
价值(var_var);
结束;

还可以执行以下操作:

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;
使用TO_LOB的唯一警告是,必须在如上所述的INSERT语句中使用它。另一方面,对使用DBMS_LOB包的限制较少。显然,一旦在VARCHAR2列中有了值,就可以用它做任何事情


希望这有帮助。

使用动态sql(
executeimmediate
)有一个很好的技巧

这将生成表单的输出

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);

这里我使用了一个
DATE
类型的分区列。您可以使用
时间戳
变量。

请避免只回答代码,并提供一些解释。因此,请指定此选项适用于哪个版本的Oracle。
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;
/
SELECT 
  PARTITION_NAME,
  high_value
FROM XMLTABLE(
'/ROWSET/ROW'
PASSING
  DBMS_XMLGEN.GETXMLTYPE
    (Q'~
select
   p.partition_name,
   p.high_value
from user_tab_partitions p
 where table_name = 'MYTABLE'
order by partition_position
~'
)
COLUMNS PARTITION_NAME, HIGH_VALUE
);