Chinaunix首页 | 论坛 | 博客
  • 博客访问: 188615
  • 博文数量: 45
  • 博客积分: 1657
  • 博客等级: 上尉
  • 技术积分: 765
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-13 12:42
文章分类

全部博文(45)

文章存档

2012年(1)

2011年(4)

2010年(6)

2009年(3)

2008年(31)

分类: IT职场

2008-08-25 20:29:53

这几天学习pro*c编程,今天稍微理出了一些头绪。

如果仅pro*c编程倒不是太难,关键是环境设置比较麻烦。
下面的egg.pc是在我机器上运行成功的,先发上来供以后学习参考。
第二个是makefile文件,第三个shell脚本。加上x权限,运行脚本就行。
makefile中我之所以就写个-lclntsh,是因为头文件路径、库路径都已在环境变量中设置好了(C_INCLUNDE_PATH和LD_LIBRARY_PATH)。
全写应该是gcc -o xx xx.c -I$ORACLE_HOME/precomp/public -L$ORACLE_HOME/lib -lclntsh。其中xx.c是.pc文件被proc程序生成的。

如果不行的话,那应该是要在$ORACLE_HOME/precomp/admin/pcscfg.cfg文件中加上很多include信息,至于为什么却还不太清楚。



调试过程有点小插曲,一个1403错误,使我痛不欲生!
google一下,1403 表示刚才的语句没有找到符合条件的记录。有这么几种情况:

1。DML(insert,delete,update)没有找到一条记录
2。fetch 不到记录了
3。select into 没有找到记录

我纳闷,怎么会找不到记录?

整了半天,我的判断结语句是这样写的:
 if (sqlca.sqlcode = 1403) {

在山穷水尽的时候,看到这一出,我差一点崩溃!
改过来,OK!



都是在网上找的,没啥实质内容,好好学习,任重路远。


egg.pc

#include <stdio.h>
#include <sqlca.h>
#include <stdlib.h>


/* SQL COMMINICATION AREA */
EXEC SQL INCLUDE sqlca;
//EXEC ORACLE OPTION (RELEASE_CURSOR = YES);


EXEC SQL BEGIN DECLARE SECTION;
    VARCHAR username[20];
    VARCHAR password[20];
EXEC SQL END DECLARE SECTION;


/* c function */
void sqlerror();

main() {

    /* inner introduction section */
    EXEC SQL BEGIN DECLARE SECTION;
        int emp_number;
        VARCHAR emp_name[15];
        //float salary;

        //float commission;

    EXEC SQL END DECLARE SECTION;

    /* C variant */
    int total_number;

    /* log on oracle */
    strcpy(username.arr, "SCOTT");
    username.len = strlen(username.arr);
    strcpy(password.arr, "TIGER");
    password.len = strlen(password.arr);

    /* error deal declare */
    //EXEC SQL WHENEVER SQLERROR DO sqlerror();

    
    /* connect to oracle */
    EXEC SQL CONNECT :username IDENTIFIED BY :password;
    printf("\n111connected to oracle as user:%s\n", username.arr);

    /* query info looply */
    total_number = 0;
    /* get all data from table emp */
    EXEC SQL DECLARE cur CURSOR FOR
    SELECT ENAME, EMPNO FROM EMP;
    
    //EXEC SQL WHENEVER NOT FOUND GOTO notfound;

    
    EXEC SQL OPEN cur;
    
    while (1) {
        emp_number = 0;
        strcpy(emp_name.arr, "");
        //memset(emp_name, 0, sizeof(emp_name));


        //EXEC SQL FETCH cur INTO :emp_name, :salary, :commission;

        EXEC SQL FETCH cur INTO :emp_name, :emp_number;
        
        if (sqlca.sqlcode == 1403) {
            printf("hello, 1403");
            break;
        }

        /* output query result */
        printf("\n\nEmployeeName\tEmployeeID\n");
        printf("--------\t----\t--------\n");
        emp_name.arr[emp_name.len] = '\0';
        printf("%-8s\t%d\n", emp_name.arr, emp_number);
        total_number = total_number + 1;
        if (total_number > 50)
            break;

        continue;

notfound:
        printf("\n not a valid employee number -- try again..\n");
    }

    printf("\n\nTotal number querid was: %d\n", total_number);
    printf("\nHave a good day.\n");

    /** deal end ,quit oracle **/
    EXEC SQL COMMIT WORK RELEASE;
    exit(0);
}

/* error deal */
void sqlerror() {

    //EXEC SQL WHENEVER SQLERROR CONTINUE;

    printf("\noracle error detected(sqlerror):\n");

    /* roll back */
    EXEC SQL ROLLBACK RELEASE;

    exit(1);
}

#egg.pc --> egg.c --> egg

egg: egg.c
    gcc -o egg egg.c -lclntsh

egg.c: egg.pc
    proc iname=egg.pc parse=none

#!/bin/bash

make -f eggmake && ./egg

include=(/oracle/product/10.2.0/precomp/public)

include=/oracle/product/10.2.0/precomp/hdrs

include=/oracle/product/10.2.0/tpcc2x_2/src

include=/oracle/product/10.2.0/precomp/precomp/include

include=/oracle/product/10.2.0/precomp/oracore/include

include=/oracle/product/10.2.0/precomp/oracore/public

include=/oracle/product/10.2.0/precomp/rdbms/include

include=/oracle/product/10.2.0/precomp/rdbms/public

include=/oracle/product/10.2.0/precomp/rdbms/demo

include=/oracle/product/10.2.0/precomp/nlsrtl/include

include=/oracle/product/10.2.0/precomp/nlsrtl/public

include=/oracle/product/10.2.0/precomp/network_src/include

include=/oracle/product/10.2.0/precomp/network_src/public

include=/oracle/product/10.2.0/precomp/network/include

include=/oracle/product/10.2.0/precomp/network/public

include=/oracle/product/10.2.0/precomp/plsql/public

阅读(1033) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~