我有MySQL和Oracle服务器。我必须定期将一些表从MySQL复制到Oracle服务器,这是通过预定的PLSQL过程完成的,为此我在MySQL和Oracle之间创建了一个DBLINK。一切都工作正常,直到我不得不复制一个开始给出错误的表
实施例
create table table_to_copy
as
select * from table_to_copy@DBLINK;
“ oracle sql错误ora-00997非法使用long数据类型”
我已经阅读了几条评论,这主要是因为隐式转换,大部分建议是执行显式的to_lob转换。但做任何手动都不是一个可行的选择。
请注意
请帮助,您的专家意见对我来说非常有价值。
注意:此处还有一些其他问题可能类似于 Illegal use of LONG datatype Oracle 但是他们找不到我想要的解决方案。
答案 0 :(得分:1)
我很欣赏这已经很晚了,我没有这个确切的设置。但是,我从Oracle(11gR2)到SQL Server(2008R2及更早版本)所做的是通过数据库链接读取INFORMATION_SCHEMA.COLUMNS,然后在PL / SQL中动态生成一个字符串到EXECUTE IMMEDIATE。
DECLARE
TYPE associative_array IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(50);
data_type_tranforms associative_array;
dynamicSQL varchar2(32767);
column_list varchar2(32767) := '';
expressions varchar2(32767) := '';
FUNCTION apply_transform(column_name VARCHAR2, data_type VARCHAR2) RETURN VARCHAR2 AS
transformed VARCHAR2(1000);
BEGIN
IF data_type_transforms.exists(data_type) THEN
transformed := replace(data_type_transforms(data_type),'$$',column_name);
ELSE
transformed := column_name;
END IF;
RETURN transformed;
END apply_transform;
FUNCTION strip_last_character(input VARCHAR2) RETURN VARCHAR2 AS
/* Remove the delimiter trailing after the last entry */
BEGIN
RETURN SUBSTR(input, 1, LENGTH(input) - 1);
END strip_last_character;
BEGIN
data_type_transforms('LONG') := 'to_lob($$)';
FOR col IN (
SELECT column_name
,data_type
FROM information_schema.columns@DBLINK
WHERE table_name = 'TABLE_TO_COPY'
ORDER BY ordinal_position
) LOOP
column_list := column_list || col.column_name ||',';
expressions := expressions || apply_transform(col.column_name, col.data_type) ||',';
END LOOP;
dynamicSQL := 'INSERT INTO table_to_copy ('||
strip_last_character(column_list)||
') SELECT '||
strip_last_character(expressions)||
' FROM table_to_copy@DBLINK';
EXECUTE IMMEDIATE dynamicSQL;
END;
我在PL / SQL索引数组中保留了一系列模板,索引是数据类型,值是'to_date(''$$'',''YYYYMMDD'')'
之类的表达式,字符$$
从中取代column_name。如果您需要完全删除数据类型(我经常这样做),我只需在数据类型数组中放入一个空字符串。