救命,oracle的long raw如何插入???100分相谢......(只能给这么多了)

flypuma 2001-09-02 06:20:27
这个问题原来发在“数据库开发”区,发现一直不能解决,冒昧借用贵地,下面是原帖子
和回答的情况,请各位大侠帮忙......

附原贴:

主  题:救命,oracle的long raw如何插入???99分相谢......(只能给这么多了)
作  者:flypuma
所属论坛:数据库开发
问题点数:99
回复次数:7
人气指数:49
发表时间:2001-8-31 16:03:38

表格结构如下:
SQL> desc s12binreport
Name Null? Type
------------------------------- -------- ----
NENAME NOT NULL VARCHAR2(20)
REP_TIME NOT NULL VARCHAR2(22)
RRN NOT NULL NUMBER(5)
S12_VERSION NOT NULL NUMBER(1)
REP_BODY LONG RAW

SQL> insert into s12binreport values('MYNAME','12:10:11',1,1,'QWERTY');
insert into s12binreport values('MYNAME','12:10:11',1,1,'QWERTY')
*
ERROR at line 1:
ORA-01465: invalid hex number

1465错误对应的帮助好像不对头的。

在程序里面用proc作同样的插入的时候也是同样错误,相关代码和结构:
typedef struct
{
char NEName[20];
char Rep_Time[20];
WORD RRN;
WORD S12_Version;
char Rep_Body[8192];
} T_S12BINREPORT;

proc 代码如下:
int InsertBinReport(T_S12BINREPORT *Log_Body)
{
char err_msg[128];
size_t buf_len, msg_len;

pthread_mutex_lock(&thread_lock);

EXEC SQL WHENEVER SQLERROR GOTO LSQLERROR;
EXEC SQL WHENEVER NOT FOUND CONTINUE;
EXEC SQL AT :ismsdbname
INSERT INTO S12BINREPORT
VALUES
(
:Log_Body
);

EXEC SQL AT :ismsdbname COMMIT WORK;
pthread_mutex_unlock(&thread_lock);
return 1;

LSQLERROR:
EXEC SQL WHENEVER SQLERROR CONTINUE;
buf_len = sizeof (err_msg);
sqlglm(err_msg, &buf_len, &msg_len);
printf("%.*s\n", msg_len, err_msg);
EXEC SQL AT :ismsdbname ROLLBACK WORK;
pthread_mutex_unlock(&thread_lock);
return 0;
}


执行的报错也是一样的。请各位大侠帮小弟一把。。。

另外,如果long raw改为long,则程序执行一些正常,但是一段很长的数据(可以几K吧)插入后变成只有十几个byte了,当然,这段数据不保证是可见字符,是任意的字节流...


回复贴子:
 xzou(缺齿小狼) 回复于2001-8-31 16:15:49
首先 long raw是二进制类型, 'QWERTY'类型不匹配,只能插入数字串 如:
hextoraw(1)
其次 按oracle的建议,long属于淘汰型类型,建议用CLOB代替
 flypuma(飞豹) 回复于2001-8-31 16:32:29
谢谢,我试了一下
insert into s12binreport values('FF','a',1,1,hextoraw('DDDDEEEEFFFFCCCC'))
是可以的,只是不知道在proc里面应该怎么改,这里是一个结构的一个field字段,总不
需要先变成字符串再用hextoraw吧? 小弟对oracle不太了解的,问题有点粗浅还望见谅。

另外,我也字段bblob替代了longraw,但是听说这样代码改动很大,所以就不打算改了,另外
blob字段类型在我的客户端delphi里面支持不好也是一个原因。
 michaelzhang(一个贫穷的农民,啥时候才能象城里人一样) 回复于2001-8-31 16:42:31
先运行utlraw包。
再用下面的试试:
insert into s12binreport
values('MYNAME','12:10:11',1,1,utl_raw.cast_to_raw('QWERTY'));

 flypuma(飞豹) 回复于2001-8-31 16:52:14
其实在sqlplus里面怎么输不重要,重要的是下面这段proc代码怎么修改才可以啊?

proc 代码如下:
int InsertBinReport(T_S12BINREPORT *Log_Body)
{
char err_msg[128];
size_t buf_len, msg_len;

pthread_mutex_lock(&thread_lock);

EXEC SQL WHENEVER SQLERROR GOTO LSQLERROR;
EXEC SQL WHENEVER NOT FOUND CONTINUE;
EXEC SQL AT :ismsdbname
INSERT INTO S12BINREPORT
VALUES
(
:Log_Body
);

EXEC SQL AT :ismsdbname COMMIT WORK;
pthread_mutex_unlock(&thread_lock);
return 1;

LSQLERROR:
EXEC SQL WHENEVER SQLERROR CONTINUE;
buf_len = sizeof (err_msg);
sqlglm(err_msg, &buf_len, &msg_len);
printf("%.*s\n", msg_len, err_msg);
EXEC SQL AT :ismsdbname ROLLBACK WORK;
pthread_mutex_unlock(&thread_lock);
return 0;
}

谢谢谢谢

 xzou(缺齿小狼) 回复于2001-8-31 17:29:38
如果是为了存储大容量字符串,long好一些,对应的类型应该是c里面的char*,pascal可能是PChar ,我用pro*c/c++测试的是可以的,具体有什么问题吗?
 jhc(老猫) 回复于2001-9-1 14:26:34
照你的定义:
char Rep_Body[8192];
只有当大容量字符串中不包含“\0”字符才行。不知你的串有没有这个问题。
 flypuma(飞豹) 回复于2001-9-2 18:14:28
我用的是longraw, 串里面有可能有\0,事实上任何字符都可能出现的, 前面说了,如果这个
串是纯粹的可显示字符串而没有像\0这样的字符的话,我就可以采用long而不是longraw了,
这样的话上面这段代码也就完全没有错误了, 难道这里没有人用 proc写过这样的代码吗?
向一个含有longraw字段的table插入记录?

...全文
286 点赞 收藏 2
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
flypuma 2001-09-03
up up up
此题无解??
回复
cqiu2000 2001-09-03
以下是一个向long Raw字段写数据(读取文件)的程序片段,希望有帮助
with TempQuery do
begin
Append;
FieldByName('nename').AsString := '';
TBlobField(FieldbyName('OpData')).LoadFromFile('c:\temp.bmp');
Post;
end;
回复
相关推荐
发帖
Sybase
创建于2007-09-28

2576

社区成员

Sybase相关技术讨论区
申请成为版主
帖子事件
创建了帖子
2001-09-02 06:20
社区公告
暂无公告