救命,oracle的long raw如何插入???100分相谢......(只能给这么多了)
这个问题原来发在“数据库开发”区,发现一直不能解决,冒昧借用贵地,下面是原帖子
和回答的情况,请各位大侠帮忙......
附原贴:
主 题:救命,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插入记录?