要做Oracle 到 PostgreSQL的迁移
遇到blob, raw, long raw数据怎么存储的问题。
查询了一下可以使用oid类型,感觉有点象Oracle的BFILE类型,但又不是。
先说自己的体会,后贴具体测试事例:
oid类型看起来方便,有很多函数lo_create, lo_import, lo_export等函数支持。用应该也可以用,但总感觉很怪。为什么呢?
1>. oid存放数据用类似PQexecPrepared怎么直接操作?不会,必须用lo等函数操作,麻烦。最少Oracle OCI对于大对象是如果存放的数据不是特别多的时候可以直接OCI bind操作的。
2>. oid类型看起来和表是不一体的,什么意思呢?表里有oid类型了,insert数据了,这个时候如果表drop了,正常人理解应该oid对应的实际数据应该就没了,但实际上postgresql里面还是存在的,必须自己手动去删除系统表管理的oid数据,哎!这点我真是。。。
下面为自己的测试:
-
-bash-3.2$ cat x
-
psql -d gandb -c "$1"
-
-bash-3.2$ x "create table tab_blob(a int, b oid)"
-
CREATE TABLE
-
-bash-3.2$ x "\d tab_blob"
-
Table "public.tab_blob"
-
Column | Type | Modifiers
-
--------+---------+-----------
-
a | integer |
-
b | oid |
-
-
-bash-3.2$ x "select * from pg_largeobject"
-
loid | pageno | data
-
------+--------+------
-
(0 rows)
-
-
-bash-3.2$ x "insert into tab_blob values(1, lo_import('/tmp/1.txt'))"
-
INSERT 0 1
-
-bash-3.2$ x "select * from pg_largeobject"
-
loid | pageno | data
-
-------+--------+---------------------------------------------------------------------------------
-
32849 | 0 | "1","11","ABC1\\""\012"2","12","ABC2\\\\"\012"3","13","ABC3"\012"4","14",""\012
-
(1 row)
-
-
-bash-3.2$ x "select * from tab_blob"
-
a | b
-
---+-------
-
1 | 32849
-
(1 row)
-
-
-bash-3.2$
-
-bash-3.2$ x "drop table tab_blob"
-
DROP TABLE
-
-bash-3.2$ x "select * from tab_blob"
-
ERROR: relation "tab_blob" does not exist
-
-bash-3.2$ x "select * from pg_largeobject"
-
loid | pageno | data
-
-------+--------+---------------------------------------------------------------------------------
-
32849 | 0 | "1","11","ABC1\\""\012"2","12","ABC2\\\\"\012"3","13","ABC3"\012"4","14",""\012
-
(1 row)
-
-
-bash-3.2$
-
# 哎,这个地方很晕死,既然oid对应的系统表数据还存在!必须手动自己删除了,我想postgresql是否在drop table的时候可以添加某个参数就可以自动把自己的oid关联数据删除了,结果测试了cascade, restrict发现还是不行。哎,下一步看看bytea什么情况!
阅读(4311) | 评论(0) | 转发(0) |