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

flypuma 2001-08-31 04:03:37
表格结构如下:
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了,当然,这段数据不保证是可见字符,是任意的字节流...
...全文
347 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
flypuma 2001-09-03
真的没有人知道吗?
回复
flypuma 2001-09-02
我用的是longraw, 串里面有可能有\0,事实上任何字符都可能出现的, 前面说了,如果这个
串是纯粹的可显示字符串而没有像\0这样的字符的话,我就可以采用long而不是longraw了,
这样的话上面这段代码也就完全没有错误了, 难道这里没有人用 proc写过这样的代码吗?
向一个含有longraw字段的table插入记录?
回复
jhc 2001-09-01
照你的定义:
char Rep_Body[8192];
只有当大容量字符串中不包含“\0”字符才行。不知你的串有没有这个问题。
回复
xzou 2001-08-31
如果是为了存储大容量字符串,long好一些,对应的类型应该是c里面的char*,pascal可能是PChar ,我用pro*c/c++测试的是可以的,具体有什么问题吗?
回复
flypuma 2001-08-31
其实在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;
}

谢谢谢谢
回复
michaelzhang 2001-08-31
先运行utlraw包。
再用下面的试试:
insert into s12binreport
values('MYNAME','12:10:11',1,1,utl_raw.cast_to_raw('QWERTY'));
回复
flypuma 2001-08-31
谢谢,我试了一下
insert into s12binreport values('FF','a',1,1,hextoraw('DDDDEEEEFFFFCCCC'))
是可以的,只是不知道在proc里面应该怎么改,这里是一个结构的一个field字段,总不
需要先变成字符串再用hextoraw吧? 小弟对oracle不太了解的,问题有点粗浅还望见谅。

另外,我也字段bblob替代了longraw,但是听说这样代码改动很大,所以就不打算改了,另外
blob字段类型在我的客户端delphi里面支持不好也是一个原因。
回复
xzou 2001-08-31
首先 long raw是二进制类型, 'QWERTY'类型不匹配,只能插入数字串 如:
hextoraw(1)
其次 按oracle的建议,long属于淘汰型类型,建议用CLOB代替
回复
相关推荐
发帖
Sybase
创建于2007-09-28

2576

社区成员

Sybase相关技术讨论区
申请成为版主
帖子事件
创建了帖子
2001-08-31 04:03
社区公告
暂无公告