下面用实例介绍一下 Oracle 的 RAW类型字段的存取。
先建表 RAW_TEST,表信息如下: SQL> DESC RAW_TEST
Name Null? Type
----------------------------------------- -------- ----------------------------
RAW1 RAW(2000)
VARCH1 VARCHAR2(100)
SQL>
程序代码:
typedef struct RAWTYPE {
unsigned short len;
unsigned char buf[2000];
} RAWTYPE;
EXEC SQL TYPE RAWTYPE IS VARRAW(2000);
void fun(...)//函数
{
...
RAWTYPE vr1;
RAWTYPE vr2;
VARCHAR vc1[100];
VARCHAR vc2[100];
char* str = "hello!";
unsigned char data[43] = {0x29, 0x00 ,0x22 ,0x2D ,0x46 ,0x0F ,0x00 ,0x2A ,0x46 ,0x0F ,0x00 ,0x8F ,0xC2 ,0xF5 ,0x28 ,0x37 ,0x4B ,0xE4 ,0x40 ,0x29 ,0x00 ,0x00 ,0x00 ,0x10 ,0x00 ,0x00 ,0x00 ,0xD8 ,0xF6 ,0x66 ,0x1E ,0x36 ,0x90 ,0x71 ,0xCC ,0xD2 ,0x21 ,0xF9 ,0x6D ,0xCE ,0xED ,0xA9 ,0x1D };
memcpy(vr1.buf, data, 43);
vr1.len = 43;
strcpy(vc1.arr, str);
vc1.len = strlen(str);
printf("\n\n.............. write RAW_TEST ..............\n");
printf("\n----- vr1 (vr1.len = %d) -----\n", vr1.len);
for(n=0; n
printf("%02X ", vr1.buf[n]);
printf("\n----- vc1 (vc1.len = %d) -----\n", vc1.len);
for(n=0; n
printf("%02X ", vc1.arr[n]);
EXEC SQL insert into RAW_TEST (RAW1, VARCH1) values (:vr1, :vc1);
EXEC SQL COMMIT WORK;
printf("\n\n.............. read RAW_TEST ..............\n");
vr2.len = vc2.len = 0;
EXEC SQL select RAW1, VARCH1 INTO :vr2, :vc2 from RAW_TEST;
printf("\n----- vr2 (vr2.len = %d) -----\n", vr2.len);
for(n=0; n
printf("%02X ", vr2.buf[n]);
printf("\n----- vc2 (vc2.len = %d) -----\n", vc2.len);
for(n=0; n
printf("%02X ", vc2.arr[n]);
printf("\n");
...
}
运行结果: .............. write RAW_TEST .............. ----- vr1 (vr1.len = 43) ----- 29 00 22 2D 46 0F 00 2A 46 0F 00 8F C2 F5 28 37 4B E4 40 29 00 00 00 10 00 00 00 D8 F6 66 1E 36 90 71 CC D2 21 F9 6D CE ED A9 1D ----- vc1 (vc1.len = 6) ----- 68 65 6C 6C 6F 21 .............. read RAW_TEST .............. ----- vr2 (vr2.len = 43) ----- 29 00 22 2D 46 0F 00 2A 46 0F 00 8F C2 F5 28 37 4B E4 40 29 00 00 00 10 00 00 00 D8 F6 66 1E 36 90 71 CC D2 21 F9 6D CE ED A9 1D ----- vc2 (vc2.len = 6) ----- 68 65 6C 6C 6F 21