Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3903514
  • 博文数量: 534
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4800
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(534)

文章存档

2021年(1)

2019年(1)

2017年(1)

2016年(2)

2013年(2)

2012年(10)

2011年(43)

2010年(10)

2009年(17)

2008年(121)

2007年(253)

2006年(73)

分类: 数据库开发技术

2016-03-01 16:15:16

要做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数据,哎!这点我真是。。。

下面为自己的测试:

点击(此处)折叠或打开

  1. -bash-3.2$ cat x
  2. psql -d gandb -c "$1"
  3. -bash-3.2$ x "create table tab_blob(a int, b oid)"
  4. CREATE TABLE
  5. -bash-3.2$ x "\d tab_blob"
  6. Table "public.tab_blob"
  7. Column | Type | Modifiers
  8. --------+---------+-----------
  9. a | integer |
  10. b | oid |
  11. -bash-3.2$ x "select * from pg_largeobject"
  12. loid | pageno | data
  13. ------+--------+------
  14. (0 rows)
  15. -bash-3.2$ x "insert into tab_blob values(1, lo_import('/tmp/1.txt'))"
  16. INSERT 0 1
  17. -bash-3.2$ x "select * from pg_largeobject"
  18. loid | pageno | data
  19. -------+--------+---------------------------------------------------------------------------------
  20. 32849 | 0 | "1","11","ABC1\\""\012"2","12","ABC2\\\\"\012"3","13","ABC3"\012"4","14",""\012
  21. (1 row)
  22. -bash-3.2$ x "select * from tab_blob"
  23. a | b
  24. ---+-------
  25. 1 | 32849
  26. (1 row)
  27. -bash-3.2$
  28. -bash-3.2$ x "drop table tab_blob"
  29. DROP TABLE
  30. -bash-3.2$ x "select * from tab_blob"
  31. ERROR: relation "tab_blob" does not exist
  32. -bash-3.2$ x "select * from pg_largeobject"
  33. loid | pageno | data
  34. -------+--------+---------------------------------------------------------------------------------
  35. 32849 | 0 | "1","11","ABC1\\""\012"2","12","ABC2\\\\"\012"3","13","ABC3"\012"4","14",""\012
  36. (1 row)
  37. -bash-3.2$
  38. # 哎,这个地方很晕死,既然oid对应的系统表数据还存在!必须手动自己删除了,我想postgresql是否在drop table的时候可以添加某个参数就可以自动把自己的oid关联数据删除了,结果测试了cascade, restrict发现还是不行。哎,下一步看看bytea什么情况!



阅读(4262) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~