数据类型和宿主变量
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 ;