pro*c/c++学习三:数据类型-宿主变量-游标-context变量

数据类型和宿主变量

Oracle Datatypes

内部类型,描述数据库表中字段。
在这里插入图片描述在这里插入图片描述

外部数据类型

在这里插入图片描述

在这里插入图片描述

宿主变量声明

可以用来声明宿主变量的类型

在这里插入图片描述

指示变量

格式如下:

:host_variable INDICATOR :indicator_variable 

或者

:host_variable:indicator_variable 

变量的值以及含义如下:
在这里插入图片描述

oracle限制

如果DBMS=V7 or V8,使用SELECT或者FETCH 空的数据到宿主变量但是不使用指示变量,oracle报错如下:

ORA-01405: fetched column value is NULL

VARCHAR 类型的变量

可以使用VARCHAR这种伪类型来声明一个带长度的字符类型。在你的程序需要跟VARCHAR2或者LONG类型交互的时候,使用这个VARCHAR更加方便。该关键字不区分大小写,但是不能混用。

声明

VARCHAR会被预编译成struct类型的变量。如下:

VARCHAR username[20];

会被编译成:

struct
{
unsigned short len;
unsigned char arr[20];
} username;

SELECT或者FETCH后,oracle会把字符长度设置进len这个变量中,你就可以使用这个变量添加null(’\0’)结束符。

使用VARCHAR插入空值

如果设置VARCHAR变量的长度为0,则UPDATE和INSERT后,这列值被设置为NULL。

函数传递VARCHAR变量

VARCHARS类型当做参数时,必须传引用。比如下面pass by pointer

VARCHAR emp_name[20]; 
... 
emp_name.len = 20; 
SELECT ename INTO :emp_name FROM emp 
WHERE empno = 7499; 
... 
print_employee_name(&emp_name); /* pass by pointer */ 
... 
 
print_employee_name(name) 
VARCHAR *name; 
{ 
    ... 
    printf("name is %.*s\n", name->len, name->arr); 
    ... 
}

cursor变量

PRO*C/C++程序中使用游标变量进行查询。游标变量是游标的句柄,必须使用PL/SQL在Oracle服务器上定义和打开游标。有关游标变量的完整信息,请参阅https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/toc.htm。

声明cursor
EXEC SQL BEGIN DECLARE SECTION;
    sql_cursor     emp_cursor;             /* a cursor variable */
    SQL_CURSOR     dept_cursor;      /* another cursor variable */
    sql_cursor     *ecp;      /* a pointer to a cursor variable */
    ...
EXEC SQL END DECLARE SECTION;
ecp = &emp_cursor;             /* assign a value to the pointer */
ALLOCATE cursor

在open或者FETCH 一个cursor之前,必须先分配一个cursor,如下:

EXEC SQL ALLOCATE :emp_cursor;

为cursor分配的内存,只有在cursor被关掉或者connection被关掉

EXEC SQL CLOSE :emp_cursor;
打开 游标变量

可以在PL/SQL存储过程中定义和打开游标,或者再PL/SQL块中打开
存储过程:

CREATE PACKAGE demo_cur_pkg AS
    TYPE EmpName IS RECORD (name VARCHAR2(10));
    TYPE cur_type IS REF CURSOR RETURN EmpName;
    PROCEDURE open_emp_cur (
               curs     IN OUT cur_type,
               dept_num IN     NUMBER);
END;

CREATE PACKAGE BODY demo_cur_pkg AS
    CREATE PROCEDURE open_emp_cur (
               curs     IN OUT cur_type,
               dept_num IN     NUMBER) IS
    BEGIN
        OPEN curs FOR
            SELECT ename FROM emp
                WHERE deptno = dept_num
                ORDER BY ename ASC;
    END;
END;

PL/SQL块:

sql_cursor emp_cursor;
int dept_num = 10;
...
EXEC SQL EXECUTE
    BEGIN
        OPEN :emp_cursor FOR SELECT ename FROM emp
             WHERE deptno = :dept_num;
    END;
END-EXEC;
...

或者如下:

...
sql_cursor emp_cursor;
...
EXEC ORACLE OPTION(select_error=no);
EXEC SQL
    SELECT CURSOR(SELECT ename FROM emp WHERE deptno = :dept_num)
    INTO :emp_cursor FROM DUAL;
EXEC ORACLE OPTION(select_error=yes);

context 变量

运行时的上下文变量,程序内存区的句柄,包括0个或者多个连接,0个或者多个游标等其他状态信息。

定义
sql_context my_context ;
初始化
EXEC SQL CONTEXT ALLOCATE :context ;
宿主变量context
EXEC SQL CONTEXT ALLOCATE :my_context ;
CONTEXT USE

使用 CONTEXT USE 预编译会直接使用CONTEXT中保存的上下文(比如CONNECT,INSERT, DECLARE CURSOR等等)

EXEC SQL CONTEXT USE {:context | DEFAULT} ;
free
EXEC SQL CONTEXT USE :my_context ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值