建立类型
create or replace type emp_type as object
(
    name        varchar2(10),
    salary      number(6,2),
    hiredate    date
);建立嵌套表
create or replace type emp_array is table of emp_type;建立数据表
drop table department;
create table department
(
    deptno      number(2) primary key,
    dname       varchar2(10),
    employee    emp_array
)nested table employee store as employee;预编译参数
proc $(InputDir)\$(InputName) sqlcheck=full userid=scott/password@exam intype=$(InputDir)\demoout.typ include=$(InputDir)【出错代码段一】:
/* 定义宿主变量 */
        emp_array*        employee_array;
        emp_type*                 employee[20];
        int deptno;
        char name[10];
        char temp[10];
/* ... */
/* 输入deptno和name */
/* ... */
/* 集合列->对象高速缓存 */
        exec sql select deptno , employee into :deptno , :employee_array
                         from   department p , table(p.employee) e
                         where  upper(e.name) = upper(:name);【proc给出的错误信息是】:
错误发生在行227, 列2, 文件.\demo16.pc
        exec sql select deptno , employee into :deptno , :employee_array
.1
PLS-S-00201, 必须声明标识符 'P.EMPLOYEE'
错误发生在行227, 列2, 文件.\demo16.pc
        exec sql select deptno , employee into :deptno , :employee_array
.1
PLS-S-00000, SQL Statement ignored
在第 227 行, 第 2 列, 文件 .\demo16.pc 有语义错误: 
        exec sql select deptno , employee into :deptno , :employee_array
.1【出错代码段二】:
        /* 定义宿主变量 */
        emp_array*   employee_array;
        emp_type            employee[20];
        emp_type*    employee_temp;
        int deptno;
        char name[10];
        char temp[10];
        int salary;
        char hiredate[20];
        int count;
        int i;
/* ... */
/* ... */
/* 取得元素属性 */
        exec sql object get * from :employee[i] into :temp , :salary , :hiredate;【proc给出的错误信息是】:
PCC-S-02346, PL/SQL 发现语义错误
在第 306 行, 第 31 列, 文件 .\demo16.pc 有语义错误: 
                exec sql object get * from :employee[i] into :temp , :salary , :
hiredate;
..............................1
PCC-S-02326, 非法的结构引用操作
在第 306 行, 第 31 列, 文件 .\demo16.pc 有语义错误: 
                exec sql object get * from :employee[i] into :temp , :salary , :
hiredate;
..............................1
PCC-S-02326, 非法的结构引用操作
在第 306 行, 第 31 列, 文件 .\demo16.pc 有语义错误: 
                exec sql object get * from :employee[i] into :temp , :salary , :
hiredate;
..............................1
PCC-S-02326, 非法的结构引用操作
在第 306 行, 第 31 列, 文件 .\demo16.pc 有语义错误: 
                exec sql object get * from :employee[i] into :temp , :salary , :
hiredate;
..............................1
PCC-S-02326, 非法的结构引用操作
在第 306 行, 第 31 列, 文件 .\demo16.pc 有语义错误: 
                exec sql object get * from :employee[i] into :temp , :salary , :
hiredate;
..............................1
PCC-S-02326, 非法的结构引用操作
在第 306 行, 第 31 列, 文件 .\demo16.pc 有语义错误: 
                exec sql object get * from :employee[i] into :temp , :salary , :
hiredate;
..............................1
PCC-S-02326, 非法的结构引用操作
在第 306 行, 第 3 列, 文件 .\demo16.pc 有语义错误: 
                exec sql object get * from :employee[i] into :temp , :salary , :
hiredate;
..1
PCC-S-02413, 属性数与主机变量数不符代码是对着《精通Oracle 10g Pro*C/C++编程》(王海亮,张立民 中国水利水电出版社)这本书书敲的
刚入门,还请高人指点啊。

解决方案 »

  1.   

    自己解决了:第一个问题是因为:
    在Pro*C中调用PL/SQL的函数时(例如table函数),应该采用sqlcheck的默认值SYNTAX.
       注意:只有sqlcheck=full时,才能在Pro*C中嵌入PL/SQL块,
           所以如果同一工程还要内嵌PL/SQL块,只能内嵌到其他的PC源文件中,
           不同的PC源文件可以采用不同的预编译选项.第二个问题是因为:
    emp_array*   employee_array;
    emp_type      employee[20];
    emp_type*    employee_temp;
    以上变量声明有笔误:
    emp_type      employee[20];
    应该写成
    emp_type*      employee[20];