ITPub博客

首页 > 数据库 > Oracle > PLSQL Language Referenc-PL/SQL静态SQL-光标变量-光标变量作为宿主变量

PLSQL Language Referenc-PL/SQL静态SQL-光标变量-光标变量作为宿主变量

原创 Oracle 作者: luisedalian 时间:2014-03-17 00:17:40 0 删除 编辑

光标变量作为宿主变量

宿主变量主要用于在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;

注意:如果从OCI客户端绑定宿主光标变量到PL/SQL,则除非在相同的服务器调用中打开它,否则不能在服务器端从它获取。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1122898/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    1986
  • 访问量
    5677165