Oracle Prc C学习 二

  1. 声明一个游标变量

EXEC SQL BEGIN DECLARE SECTION;

    SQL_CURSOR emp_cursor;

    sql_cursor dept_cursor;

EXEC SQL END DECLARE SECTION;


这样定义后,如果使用前先要分配资源用ALLOCATE

EXEC SQL ALLOCATE :emp_cursor;

EXEC SQL ALLOCATE :dept_cursor;

使用完后,要关闭

EXEC SQL CLOSE :emp_cursor;

EXEC SQL CLOSE :dept_cursor;

这个关闭只是对应游标那个OPEN操作,这里没有释放资源的,如果要释放资源

EXEC SQL FREE :emp_cursor;

EXEC SQL FREE :dept_cursor;


2. 记录一个错误

我在使用PL/SQL来创建一个包的时候,在包规范中加上了AUTHID CURRENT_USER,

然后在创建包体的时候,又加上AUTHID CURRENT_USER,

然后一直提醒我有一个警告关于这个AUTHID的,然后我把包体里的去掉就OK了。


3. 然后我按照书的例子写了一下,也遇到了编译问题,还是运行的那个不能结束的问题

2.pc

  #include <stdio.h>
#include <stdlib.h>
#include <sqlca.h>
void sql_error(char *msg)
{
    exit(1);
}
int main(int argc, char *argv[])
{
    char temp[32];
    EXEC SQL BEGIN DECLARE SECTION;
        char *uid = "scott/xx";
        SQL_CURSOR emp_cursor;
        int dept_num;
        struct {
            int emp_num;
            char emp_name[11];
            char job[10];
            int manager;
            char hire_date[10];
            float salary;
            float commission;
            int dept_num;
        } emp_info;
        struct {
            short emp_num_ind;
            short emp_name_ind;
            short job_ind;
            short manager_ind;
            short hire_date_ind;
            short salary_ind;
            short commission_ind;
            short dept_num_ind;
        } emp_info_ind;
    EXEC SQL END DECLARE SECTION;
    EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error");
    EXEC SQL CONNECT :uid;
    EXEC SQL ALLOCATE :emp_cursor;
    EXEC SQL WHENEVER NOT FOUND DO break;
    while (1) {
        printf("\nEnter department number(0 to quit): ");
        gets(temp);
        dept_num = atoi(temp);
        if (dept_num <= 0)
            break;
        EXEC SQL EXECUTE
            BEGIN
                emp_demo_pkg.open_cur(:emp_cursor, :dept_num);
            END;
        END-EXEC;
        printf("\nFor department %d--\n", dept_num);
        printf("ENAME SAL COMM\n");
        printf("----------------\n");
        while (1) {
            EXEC SQL FETCH :emp_cursor
                INTO :emp_info INDICATOR :emp_info_ind;
            printf("%s", emp_info.emp_name);
            printf("%8.2f", emp_info.salary);
            if (emp_info_ind.commission_ind != 0)
                printf("NULL\n");
            else
                printf("%8.2f\n", emp_info.commission);
        }
    }
    EXEC SQL WHENEVER SQLERROR CONTINUE;
    EXEC SQL CLOSE :emp_cursor;
    EXEC SQL ROLLBACK WORK RELEASE;
    return 0;
}

我在用proc编译的时候遇到这种错误

          1.         EXEC SQL EXECUTE
.................1
PCC-S-02345, SQLCHECK=SEMANTICS must be given when embedded PL/SQL blocks are used

这个就是在程序中有PL/SQL块的时候要加上一个编译选项

SQLCHECK=SEMANTICS   或者=FULL,这我还没有研究有什么区别

这样以后又遇到另一个问题,在程序中使用了scott用户下的package,但是一编译却找不到,说要声明,

然后在编译选项中加上

userid=scott/xx   这个是我的scott用户的名和密码,这个我觉得是他在编译的时候要先到用户下找一下这个package

要不然它怎么知道有没有呢。

然后我使用的完整的编译命令就是

proc PARSE=NONE CODE=KR_C LINE=YES INAME=2.pc MODE=ORACLE DBMS=V8 UNSAFE_NULL=YES SQLCHECK=FULL userid=scott/xx

            2. 这样我就再编译成可执行文件,一执行,还是那个不能从循环中退出的问题,还没有解决,

解决了,再回来记录下来问题解决办法。





















郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。