光标变量作为宿主变量
宿主变量主要用于在PL/SQL存储存储子程序和它的客户端之间传递查询结果集。当光标变量为宿主变量的时候,PL/SQL和它的客户(宿主环境)共享存储查询结果集的SQL工作区指针。
为了把光标变量作为宿主变量,需要在宿主环境中声明光标变量,然后把它作为输入宿主变量(绑定变量)传递给PL/SQL。宿主光标变量兼容任何返回类型,即是弱类型的。
--光标变量作为Proc*C客户端程序中的宿主变量 EXEC SQL BEGIN DECLARE SECTION; SQL_CURSOR generic_cv; -- 声明宿主光标变量 int choice; -- 选择 EXEC SQL END DECLARE SECTION; EXEC SQL ALLOCATE :generic_cv; -- 初始宿主光标变量 -- 将宿主光标变量传递给PL/SQL块 / EXEC SQL EXECUTE BEGIN IF :choice = 1 THEN OPEN :generic_cv FOR SELECT * FROM employees; ELSIF :choice = 2 THEN OPEN :generic_cv FOR SELECT * FROM departments; ELSIF :choice = 3 THEN OPEN :generic_cv FOR SELECT * FROM jobs; END IF; END; END-EXEC; |
当有任何光标变量指向它的时候,SQL工作区仍然是可访问的,即使是从一个范围向另一个范围。例如上例中,Proc*C程序传递宿主光标变量到嵌入的匿名PL/SQL块中。在块运行之后,光标变量仍然指向SQL工作区。
如果在客户端有PL/SQL引擎,则从客户端调用服务器没有限制。例如,可以客户端声明一个宿主光标变量,然后打开从服务器端打开和获取它,然后从客户端打开和获取它。也可以通过在PL/SQL匿名块中的一个往返中打开和关闭多个宿主光标变量,来降低网络流量。
--在宿主环境中的PL/SQL匿名块 BEGIN OPEN :emp_cv FOR SELECT * FROM employees; OPEN :dept_cv FOR SELECT * FROM departments; OPEN :loc_cv FOR SELECT * FROM locations; END; |
在PL/SQL匿名块运行之后,光标变量仍然指向SQL工作区,所以客户端程序可以使用它。当客户端程序不再需要这些光标变量的时候,可以使用PL/SQL匿名块来关闭它们。
--宿主环境中的匿名PL/SQL块 BEGIN CLOSE :emp_cv; CLOSE :dept_cv; CLOSE :loc_cv; END; |
这个技术对于在Oracle Form中产生多块窗体非常有用。
BEGIN OPEN :c1 FOR SELECT 1 FROM DUAL; OPEN :c2 FOR SELECT 1 FROM DUAL; OPEN :c3 FOR SELECT 1 FROM DUAL; END; |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1122898/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17013648/viewspace-1122898/