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. 这样我就再编译成可执行文件,一执行,还是那个不能从循环中退出的问题,还没有解决,

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

时间: 2024-11-05 12:25:51

Oracle Prc C学习 二的相关文章

Oracle的基本学习(二)&mdash;基本查询

一.基本查询语句 (1)查看当前用户 show user;   (2)查看当前用户下的表 select * from tab;   (3)查看员工表的结构 desc emp;   (4)选择全部列 SELECT * FROM emp;   (5)选择特定的列 SELECT empno,ename,sal,comm,deptno FROM emp;   (6)定义空值 a: 空值是无效的,未指定的,未知的的值. b: 空值不是空格或者0. c: 包含空值的数据表达式的值都是空值. --空值不同于0

Oracle Prc C学习 之 Oracle动态SQL

在这里我先说遇到的一个问题 在练习的例子中加入了头文件 #include <oraca.h> 然后我怎么编译都不行,一直说找不到oraca.h 然后我把这个改成了 EXEC SQL INCLUDE oraca; 这样就顺利的编译过去了. 第一种动态SQL语句:无宿主变量的非查询语句 应用程序接收外界输入构造SQL 语句到一个字符串,然后调用EXECUTE IMMEDIATE 命令执行这个SQL 语句.这种SQL 语句不能为SELECT 语句,不能包含输入变量的占位符. 5.pc #includ

蜗牛—ORACLE基础之学习(二)

如何创建一个表,这个表和还有一个表的结构一样但没有数据是个空表,旧表的数据也插入的 create table newtable as select * from oldtable 清空一个表内的数据 delete from tablename

Oracle Prc C学习 五 事务

这个事务刚开始的时候我很不理解, 我以为是这个事务是一种结构,或者是一个package或者一个procedure, 后来我觉得我想明白点了,其实这个事务只是一件我要完成的事,这件事我不然就完成,要不然就没完成,没完成就回到开始 的状态,或者回到一个你设定的状态那. 如果在程序中就是一个SQL语句开始了,就开始了一个事务,当你觉得这个事务完成了,就调用COMMIT,这就是完成了 一个事务了,当然了,也可以用ROLLBACK,就是回滚这个事务做的事.也就当这个事务完成了,这个完成就是失败的完成 应该

Oracle学习(二):过滤和排序

1.知识点:可以对照下面的录屏进行阅读 SQL> --字符串大小写敏感 SQL> --查询名叫KING的员工信息 SQL> select * 2 from emp 3 where ename = 'KING'; SQL> --日期格式敏感 SQL> --查询入职日期为17-11月-81的员工 SQL> select * 2 from emp 3 where hiredate='17-11月-81'; --正确例子 SQL> ed 已写入 file afiedt.b

ORACLE之ASM学习

ASM(Automatic Storage Management)是Oracle10g R2中为了简化Oracle数据库的管理而推出来的一项新功能,这是Oracle自己提供的卷管理器,主要用于替代操作系统所提供的LVM,它不仅支持单实例,同时对RAC的支持也是非常好. 一.ASM由来 ASM是Oracle 10g R2中为了简化Oracle数据库的管理而推出来的一项新功能,这是Oracle自己提供的卷管理器,主要用于替代操作系统所提供的LVM,它不仅支持单 实例,同时对RAC的支持也是非常好.A

Oracle内存管理理论篇二

目标 了解oracle内存管理方式 掌握ASMM管理方式 掌握AMM管理方式 监控内存使用 学习一个知识点时,最好先了解其历史.ORACLE近期的版本都对内存管理做了简化,从9i通过PGA_AGGREGATE_TARGET参数实现PGA的自动管理,10g通过Automatic Shared Memory Management(ASMM)实现SGA的自动管理,到11g通过Automatic Memory Management(AMM)实现内存(SGA+PGA)的自动管理.目前的11G版本,DBA只

Oracle之函数学习以及事务

Oracle之函数学习 1.字符函数是oracle中最常用的函数 lower(char):将字符串转化为小写的格式 upper(char):将字符串转化为大写的格式 length(char):返回字符串的长度 substr(char,m,n):取字符串的子串 将所有的员工的名字按小写的方式显示? SQL> select lower(ename),sal from emp; LOWER(ENAM        SAL ---------- ---------- smith            

spring 自定义标签 学习二

在上篇中写的只支持写属性,不支持标签property的写法,但是如果有时候我们还想做成支持 property的用法,则可以在xsd中增加spring 自带的xsd引用 修改xsd文件如下: <?xml version="1.0"encoding="UTF-8"?> <xsd:schema xmlns="http://www.ruishenh.com/custom/myTest" xmlns:xsd="http://ww