其实我不会Pro*c,但我有一点关于Pro*c的文档,不知怎样发给你?

解决方案 »

  1.   

    谢谢,不过我有相关的文档,关键是我认为我的程序是对的,不知道错在那里。希望能有人给我个例子或指出我的错误。再次对你的表示感谢。
    我的email是:[email protected]
      

  2.   

    以下是本人随便找了一段,不知道能否给你些帮助,祝你成功!
    **SQL嵌套源程序示例
    #unclude<stdio.h>
    typedef char asciz[20];
    EXEC SQL BEGIN DECLARE SECTION;
    EXEC SQL TYPE asciz IS STRING (20) REFERENCE;
    asciz  username;
    asciz password;
    asciz emp_name(5);
    int emp_number(5a);
    float salary[5];
    EXEC SQL END DECLARE SECTION;
    EXEC SQL INCLUDE sqlca;
    Void print_rows();
    Void sqlerror();
    Main()
    {
    int num_ret;
    strcpy(username,”SCOTT’);
    strcpy(password, “TYGER”);
    EXEC SQL WHENEVER SQLERROR DO sqlerror();
    EXEC SQL CONNECT:username IDENTIFIED BY:password;
    Print (“\nConnected to ORACLE as user:%s\n”, username);
    EXEC SQL DECLARE c1 CURSOR FOR 
    SELECT EMPNO , ENAME , SAL FROM EMP;
    EXEC SQL OPEN c1;
    Num_ret = 0;
    For(;;)
    {
    EXEC SQL WHENEVER NOT FOUND DO break;
    EXEC SQL FETCH c1 INTO : emp_number , :emp_name , :salary;
    Print_rows (sqlca.sqlerrd[2] – num_ret);
    Num_ret=sqlca.sqlerrd[2];
    }
    if ((sqlca.sqlerrd[2] – num_ret)>0);
    print _rows(sqlca.sqlerrd[2] –num_ret);
    EXEC SQL CLOSE c1;
    Printf(“\Have a good day.\n”);
    EXEC SQL COMMIT WORK RELEASE;
    }void print_rows(n);
    int n;
    {
    int i;
    printf(“\nNumber Employee Salary\n”);
    printf(“------------------------------\n”);
    for (i=0;i<n; i++ )
    printf(“% - 9d%- 8s%9.2f\n”,emp-number[i], emp---name[i],salary[i];
    }
    void sqlerror()
    {
    EXEC SQL WHENEVER SQLERROR CONTINUE;
    Printf(“\noracle error detected:\n”);
    Printf(‘\n%.70s\n”, sqlca.sqlerrm.sqlerrmc);
    EXEC SQL ROLLBACK WORK RELEASE;
    Exit(1);
    }**错误检测和恢复
    在使用SQL语句和PRO*C对数据库进行操作时,常常有字段空值,无条件删除,无行返回,数据溢出和截断等现象发生,这种现象可以用SQLCA和指示器变量来检测。1 SQLCA的结构
    在PRO*C程序中SQLCA结构如下:
    STRUCT SQLCA{
       Char sqlcaid[8];
       Long  sqlabc;
       Long  sqlcode;
    STRUCT{
           Unsigned sqlerrm1;
           Char sqlerrmc[10];
           }sqlerrm;
    Char sqlerrp[8];
    Long sqlerrd[6];
    Char sqlwarn[8];
    Char sqlext[8];
    }
    其中:
    1) SQLCA.sqlerrm.sqlerrmc:带有SQLCA。SQLCODE的错误正文。
    2) SQLCA.sqlerrd:当前ORACLE的状态,只有SQLCA.SQLERRD[2]有意义,表示DML语句处理的行数。
    3) SQLCA.sqlwarn:提供可能遇到的条件信息。在每执行一个SQL语句后,ORACLE就把返回结果放入SQLCA中,但说明语句除外。
    用SQLCA可以查看SQL语句的执行结果。往往有三种结果:
                         =0:执行成功;
    SQLCA.SQLCODE=    >0:执行成功的状态值;
                            <0:失败,不允许继续执行。2 指示器变量
    指示器变量有时也称指示变量.指示变量与一个主变量相关联,指出主变量的返回情况.
                 =0:返回值不为空, 未被截断,值放在主变量中;
    返回值=      >0:返回值为空, 忽略主变量的值;
                    <0:主变量长度不够就被截断。
    使用指示变量要注意:
    &#61548; 在WHERE子句中不能用指示变量。用NULL属性来测试空值。
    例如下列子句:
    SELECT…
    FROM…
    WHERE ENAME IS NULL;
    是正确的,而
    WHERE ENAME=:PEME:PEME1
    是错误的。
    &#61548; 指示变量在插入空值之前为—1
    &#61548; 可输出空值。3 WHENEVER语句
    WHENEVER是说明语句,不返回SQLCODE, 只是根据SQLCA中的返回码指定相关的措施。格式为
    EXEC SQL WHENEVER [SQLERROR|SQLWARNING|NOTFORUND]
                         [STOP|CONTINUE|GOTO<标号>];
    其中
    (1)[STOP|CONTINUE|GOT<标号>]的缺省值为CONTINUE。
    (2)SQLERROR:SQLCA.SQLCODE<0;
    (3)SQLWARNIGN:SQLCA.SQLWARN[0]=“W”;
    (4)NOTFOUND:SQLCA.SQLCODE=1403;
    下面给出一段程序来说明WHENEVER的用法:
    EXEC SQL BEGIN DEELARE SECTION;
    VARCHAR UID[20];
    VARCHAR PASW[20];
    ……
    EXEC SQL END DECLARE SECTION;
    EXEC SQL INCLUDE SQLCA;
    Main()
    {
    ……
    EXEC SQL WHENEVER SQLERROR GOTO ERR;
    EXEC SQL CONNECT:UID/:PWD;
    ……
    EXEC SQL DECLARE CSOR1 CURSOR FOR
    SELECT 〈字段〉
    FORM〈表〉
    EXEC SQL OPEN CSOR1;
    SQL 
    ……
    EXEC SQL WHENEVER NOT FOUND GOTO good;
    For(;;)
    EXEC SQL FETCH CSOR, INTO……
    Good:
    ……
    printf(“\n查询结束\n”);
    EXEC SQL CLOSE C1;
    EXEC SQL WHENEVER SQLERROR CONTINUE.
    EXEC SQL COMMIT WORK RELEASE:
    Exit();
    Printf(“\n%70s|n”, sqlca.sqlerrm.sqlerrmc);
    EXEC SQL ROLLBACK WORK RELEASE:
    Exit(1);
    }**动态定义语句
    SQL语句分动态定义语句和静态定义语句两种:
    (1) 静态定义语句:SQL语句事先编入PRO*C中,在经过预编译器编译之后形成目标程序*。BOJ,然后执行目标程序预即可。
    (2) 动态定义语句:有些语句不能事先嵌入到PRO*C程序中,要根据程序运行情况,用户自己从输入设备上(如终端上)实时输入即将执行的SQL语句。
    动态定义语句有:
    &#61548; EXECUTE IMMEDIATE;
    &#61548; PREPARE 与EXECUTE;
    &#61548; PREPARE与FETCH 和 OPEN ;
    &#61548; BIND与DEFINE DESCRIPTOR。1. EXECUTE IMMEDIATE语句
    此语句表示立即执行, 并且只向SQLCA返回执行结果,无其它信息。例如:
    EXEC SQL BEGIN DECLARE SECTION;
    VARCHAR abcd[89];
    VARCHAR deay[20];
    EXEC SQL END DECLARE SECTION;
    /**   输出字符串到abcd  **/
    EXEC SQL EXECUTE IMMEDIATE :abcd;
    注意:
    1) EXECUTE IMMEDIATE只能运行带一个参数的动态语句。其中,abcd是参数,不是关键字。
    2) EXECUTE IMMEDIATE使用的先决条件是:SQL语句不能包含主变量;SQL语句不能是查询语句。
    3) 可用任何主变量作为EXECUTE IMMEDIATE的参数;也可用字符串作为主变量。2. PREPARE与EXECUTE语句
    此语句表示“预编译/执行”。此语句能够预编译一次而执行多次。语法为:
    EXEC SQL PREPARE 〈语句名〉FROM:主变量;
    EXEC SQL EXECUTE〈语句名〉[USING:替换主变量];
    PREPARE语句做两件事:
    (1) 预编译SQL语句;
    (2) 给出SQL语句的语句名。
    注意:
    &#61548; SQL语句不能是查询语句;
    &#61548; PREPARE和EXECUTE可包含主变量;
    &#61548; PREPARE不能多次执行。
    例如:<example.pc>
    #define USERNAME “SCOTT”
    #define PASSWORD “TIGER”
    #include <stdio.h>
    EXEC SQL INCLUDE sqlca;
    EXEC SQL BEGIN DECLARE SECTION;
      Char * username=USERNAME;
      Char * password=PASSWORD;
      VARCHAR sqlstmt[80];
      Int emp_number;
      VARCHAR emp_name[15];
      VARCHAR job[50];
    EXEC SQL END DECLARE SECTION;
    Main()
    {
    EXEC SQL WHENEVER SQLERROR GOTO :sqlerror;
    EXEC SQL CONNECT :username IDENTIFIED BY :password;
    Sqlstmt.len=sprintf(sqlstmt.arr,”INSERT INTO EMP (EMPNO,ENAME,JOB,SAL)
     VALUES(:V1,:V2,:V3,:V4)”);
    Puts(sqlstmt.arr);
    EXEC SQL PREPARE S FROM :sqlstmt;
    For(;;)

       printf(“\nenter employee number:”);
       scanf(“%d”,&emp_number); 
       if (emp_number==0) break;
       printf(“\nenter employee name:”);
       scanf(“%s”,&emp_name.arr);
       emp_name.len=strlen(emp_name.arr);
       printf(“\nenter employee job:”);
       scanf(“%s”,job.arr); 
       job.len=strlen(job.arr);
       printf(“\nenter employee salary:”);
       scanf(“%f”,&salary);
     }
    EXEC SQL EXECUTE S USING :emp_number,:emp_name,:job,:salary;
      

  3.   

    谢谢qiuyang_wang(小数点),不过这段程序的取纪录不是在线程中进行的。而我的问题在于线程中进行会有问题,不过我找到了一个避免的方法就是对包含proc代码行数调用的地方用extern "C"修饰一下就可以了,感觉上和c runtime library有关系,真是奇怪阿。再次谢谢你对这个问题的关注。
      

  4.   

    谢谢qiuyang_wang(小数点),不过这段程序的取纪录不是在线程中进行的。而我的问题在于线程中进行会有问题,不过我找到了一个避免的方法就是对包含proc代码行数调用的地方用extern "C"修饰一下就可以了,感觉上和c runtime library有关系,真是奇怪阿。再次谢谢你对这个问题的关注。
      

  5.   

    谢谢qiuyang_wang(小数点),不过这段程序的取纪录不是在线程中进行的。而我的问题在于线程中进行会有问题,不过我找到了一个避免的方法就是对包含proc代码行数调用的地方用extern "C"修饰一下就可以了,感觉上和c runtime library有关系,真是奇怪阿。再次谢谢你对这个问题的关注。