我正在尝试从长列插入 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
。让我知道你的想法。
使用单个语句立即从
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;
当您在 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
您可以使用标准函数将 long 转换为 varchar2:
sys.DBMS_METADATA_UTIL.long2varchar
或敲击:
sys.DBMS_METADATA_UTIL.long2clob
按下按钮,通过 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;