将 Long 转换为 Varchar2

问题描述 投票:0回答:4

我正在尝试从长列插入 varchar2 列。这是下面的例子,

TEXT.TEXT_COL = VARCHAR2(4000)
NOTE.TEXT_NOTE = LONG

INSERT INTO TEXT(ROW_ID, TEXT_COL)
SELECT 1, TEXT_NOTE FROM NOTE; 

当我运行上面的 sql 时出现错误

SQL 错误:ORA-00997:非法使用 LONG 数据类型

我也使用了

TO_LOB()
,但仍然是同样的错误。

有没有什么函数可以简单地隐藏

long
并将其放入
varchar2
。让我知道你的想法。

sql oracle ora-00997
4个回答
18
投票

使用单个语句立即从

long
转换为
varchar2
是不可能的,因为
long
有某些限制。

您可以创建临时表或使用PL/SQL代码来解决您的问题:

  • 临时表:

    CREATE TABLE TABLE2 AS SELECT TO_LOB(COLUMN1) COLUMN FROM TABLE1;

  • PL/SQL 代码:

    DECLARE
      VAR1 LONG;
      VAR2 VARCHAR2(4000);
    BEGIN
      SELECT TEXT INTO VAR1 FROM USER_VIEWS WHERE ROWNUM = 1;  
      VAR2 := SUBSTR(VAR1, 1, 4000);
      DBMS_OUTPUT.PUT_LINE(VAR2);
    END;
    

1
投票

当您在 FOR 循环中选择 LONG 时,Oracle 似乎会在内部将 LONG 转换为其他内容(可能是 CLOB)。我在 Oracle 文档中没有找到任何解释,但这可行

BEGIN
  FOR V IN (SELECT ROWID,TEXT_NOTE FROM NOTE)
  LOOP
    INSERT INTO TEXT VALUES(V.ROWID, SUBSTR(V.TEXT_NOTE, 1, 4000) );   
  END LOOP;
  COMMIT;
END;

这是一个如何将所有视图从另一个架构复制到您的架构的示例

BEGIN
  FOR V IN (SELECT VIEW_NAME, TEXT_LENGTH, TEXT FROM ALL_VIEWS WHERE OWNER = 'PROD')
  LOOP
    EXECUTE IMMEDIATE 'CREATE OR REPLACE FORCE VIEW '||V.VIEW_NAME||' AS '||SUBSTR(V.TEXT, 1, V.TEXT_LENGTH);
    DBMS_OUTPUT.PUT_LINE('View '||V.VIEW_NAME||' created');
  END LOOP;
END;

由于某种原因,它仅适用于 FOR 循环,如果您使用WITH或从另一个查询中选择则不起作用

INSERT INTO TEXT
WITH V AS(SELECT ROWID ROW_ID,TEXT_NOTE FROM NOTE)
SELECT V.ROW_ID, SUBSTR(V.TEXT_NOTE, 1, 4000) FROM V; 

INSERT INTO TEXT
SELECT ROW_ID, SUBSTR(TEXT_NOTE, 1, 4000) 
FROM (SELECT ROWID ROW_ID,TEXT_NOTE FROM NOTE); 

两个插入都会引发相同的错误

ORA-00932:数据类型不一致:预期的 CHAR 变为 LONG


0
投票

您可以使用标准函数将 long 转换为 varchar2:

sys.DBMS_METADATA_UTIL.long2varchar

或敲击:

sys.DBMS_METADATA_UTIL.long2clob

0
投票

按下按钮,通过 tabela 参数,或 ROWID 进行注册。 Funcao já Converte o LONG para varchar2 limitando em 4000 caractéres.

create or replace function fn_longtovarchar(
       v_table varchar2, 
       v_campo varchar2,
       v_rowid varchar2
) return varchar2 is
    t_sql varchar2(4000);
    t_varlong LONG;
    t_vartxt VARCHAR2(4000);
begin

  t_sql := 'select '||v_campo||' from '||v_table||' where rowid = '''||v_rowid||'''';
  
  execute immediate t_sql into t_varlong;
  
  t_vartxt := substr(t_varlong, 1, 4000);
  
  return(t_vartxt);

end;
© www.soinside.com 2019 - 2024. All rights reserved.