程序代码如下所示:#include <stdio.h>
#include <string.h>/* Define constants for VARCHAR lengths. */
#define UNAME_LEN 20
#define PWD_LEN 40/* Declare variables.No declare section is needed if MODE=ORACLE.*/
VARCHAR username[UNAME_LEN];/* VARCHAR is an Oracle-supplied struct */
varchar password[PWD_LEN];
/* varchar can be in lower case also. *//*
    Define a host structure for the output values of a SELECT statement.
*/
struct {
    VARCHAR emp_name[UNAME_LEN];
    float salary;
    float commission;
} emprec;/*
    Define an indicator struct to correspond to the host output struct.
*/
struct
{
    short emp_name_ind;
    short sal_ind;
    short comm_ind;
} emprec_ind;/* Input host variable. */
int emp_number;
int total_queried;/* Include the SQL Communications Area.
You can use #include or EXEC SQL INCLUDE. */
#include <sqlca.h>/* Declare error handling function. */
void sql_error();main()
{
    sql_context ctx;
    char temp_char[32];    strncpy((char *) username.arr, "SCOTT", UNAME_LEN);
    username.len = strlen((char *) username.arr);    strncpy((char *) password.arr, "TIGER", PWD_LEN);
    password.len = strlen((char *) password.arr);    EXEC SQL CONTEXT ALLOCATE :ctx;
    EXEC SQL CONTEXT USE :ctx;    /* Register sql_error() as the error handler. */
    EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n");    /* Connect to ORACLE. Program will call sql_error()
    * if an error occurs when connecting to the default database.
    */    EXEC SQL CONNECT :username IDENTIFIED BY :password;
    printf("\nConnected to ORACLE as user: %s\n", username.arr);    /* Loop, selecting individual employee’s results */
    total_queried = 0;
    for (;;)
    {
        /* Break out of the inner loop when a
         * 1403 ("No data found") condition occurs.
         */
        EXEC SQL WHENEVER NOT FOUND DO break;
        for (;;)
        {
            emp_number = 0;
            printf("\nEnter employee number (0 to quit): ");
            gets(temp_char);
            emp_number = atoi(temp_char);
            if (emp_number == 0)
                break;
            EXEC SQL SELECT ename, sal, NVL(comm, 0)
                INTO :emprec INDICATOR :emprec_ind
                FROM EMP
                WHERE EMPNO = :emp_number;            /* Print data. */
            printf("\n\nEmployee\tSalary\t\tCommission\n");
            printf("--------\t------\t\t----------\n");            /* Null-terminate the output string data. */
            emprec.emp_name.arr[emprec.emp_name.len] = '\0';
            printf("%-8s\t%6.2f\t\t",
                   emprec.emp_name.arr, emprec.salary);
            if (emprec_ind.comm_ind == -1)
                printf("NULL\n");
            else
                printf("%6.2f\n", emprec.commission);
            total_queried++;
        } /* end inner for (;;) */
        if (emp_number == 0) break;
        printf("\nNot a valid employee number - try again.\n");
    } /* end outer for(;;) */    printf("\n\nTotal rows returned was %d.\n", total_queried);
    printf("\nG'day.\n\n\n");    /* Disconnect from ORACLE. */
    EXEC SQL COMMIT WORK RELEASE;
    exit(0);
}void sql_error(msg)
char *msg;
{
    char err_msg[128];
    int buf_len, msg_len;
    EXEC SQL WHENEVER SQLERROR CONTINUE;
    printf("\n%s\n", msg);
    buf_len = sizeof (err_msg);
    sqlglm(err_msg, &buf_len, &msg_len);
    printf("%.*s\n", msg_len, err_msg);
    EXEC SQL ROLLBACK RELEASE;
    exit(1);
}

解决方案 »

  1.   

    加了EXEC SQL CONTEXT之后它提示我:
    Undeclared identifier ctx.
      

  2.   

    ORACLE提供的sample1.pc中原来没有这三句:    sql_context ctx;
        EXEC SQL CONTEXT ALLOCATE :ctx;
        EXEC SQL CONTEXT USE :ctx;使用ProC编译时,出错提示是“No EXEC SQL CONTEXT USE statement encountered”。修改程序加了以上三句之后,ProC编译是通过了,可是再使用CC来编译时,它却提示“Undeclared identifier ctx.”!这是为什么呢?
      

  3.   

    我windows 下cc编译一个proc 文件时报出一个link错:
     error LNK2001: unresolved external symbol _sqlcxt
    后来,我cc时加上了一个库文件:../precomp/lib/msvc/oraSQL9.LIB就没问题了。
    我想,你的ctx也应该是在哪个库文件中吧,找到它,cc时带上它试一试