在mzq用户下建立的表结构如下:
 desc trade_type;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 TT_ID                                     NOT NULL VARCHAR2(3)
 TT_NAME                                   NOT NULL VARCHAR2(12)
 TT_IS_SELL                                NOT NULL NUMBER(1)
 TT_IS_MRKT                                NOT NULL NUMBER(1)
程序如下:
#include <stdio.h>
#include <string.h>
 
EXEC SQL INCLUDE SQLCA;main()
{
EXEC SQL BEGIN DECLARE SECTION;
static char usr[80];
static char wd[80];
char id[3];
char name[12];
EXEC SQL END DECLARE SECTION;memset (usr,'\0',sizeof(usr));
memset(wd,'\0',sizeof(wd));
memset(id,'\0',sizeof(id));
memset(name,'\0',sizeof(name));
strcpy(usr,"mzq");
strcpy(wd,"youyou");
strcpy(id,"TMB");
strcpy(name,"feng");
EXEC SQL CONNECT :usr IDENTIFIED BY :wd;
if(sqlca.sqlcode!=0)
{
printf("link error!");
}
else
{
printf("\nConnected to Oracle as user :%s\n",usr);
printf("link!\n");
EXEC SQL SELECT tt_name INTO :name FROM trade_type WHERE tt_id =:id;//怀疑没有执行
printf("%s  %s",id,name);
}
exit(0);
}
执行该程序时,结果如下:
Connected to Oracle as user :mzq
link!
TMB  feng但是结果是不正确的,
在数据库里查询,正确的结果应为:
select tt_name from trade_type where tt_id='TMB';TT_NAME
------------
Market-Buy此外,在pro*C程序中,如果我给name赋值为空,则输出也为空,所以我判断sql语句没有执行,不知原因在哪里。
还有,在该程序里调用建立在该表上的存储过程时,没有任何的错误信息,但存储过程就是不执行。而我用以前复制的scott用户的emp表在pro*c中进行查询操作或是调用存储过程时,却能正常执行。难道自己建立的表还存在允不允许外部访问的问题?初学,现在时一头雾水啊,急寻众位指点!多谢~

解决方案 »

  1.   

    测试一下这个sqlEXEC SQL SELECT to_char(sysdate,'yyyymmdd') into :name from dual;
      

  2.   

    char name[12];
    改成
    char *name;
    试一下
      

  3.   

    没有看到这样在Pro *C中直接使用char组数或者char*的,碰到这样的情况都要用VARCHAR。VARCHAR是一个struct,包含arr和len两个成员,其中arr包含的就是实际的字符串,len就对应的长度值。兄弟在很久以前也犯过同样的错误:)。代码修改建议如下:EXEC SQL BEGIN DECLARE SECTION; 
    static char usr[80]; 
    static char wd[80]; 
    char id[3]; 
    char name[12]; 
    EXEC SQL END DECLARE SECTION; 改成:EXEC SQL BEGIN DECLARE SECTION; 
    static VARCHAR usr[80]; 
    static VARCHAR wd[80]; 
    VARCHAR id[3]; 
    VARCHAR name[12]; 
    EXEC SQL END DECLARE SECTION; strcpy(usr,"mzq"); 
    改成:
    strcpy(usr.arr, "mzq");
    usr.len = strlen(usr.arr);其他如:
    strcpy(wd,"youyou"); 
    strcpy(id,"TMB"); 
    strcpy(name,"feng"); 
    同此办理。楼主可以到Oracle Pro *C/C++ 和OCI 最详细的教程下载这本书看看,里面有非常详细的讲解。
      

  4.   

    会不会是这样啊?EXEC SQL SELECT tt_name INTO :name FROM trade_type WHERE tt_id =':id';