ITPub博客

首页 > 数据库 > Oracle > PLSQL Language Referenc-PL/SQL动态SQL-DBMS_SQL包-DBMS_SQL.TO_REFCURSOR()函数

PLSQL Language Referenc-PL/SQL动态SQL-DBMS_SQL包-DBMS_SQL.TO_REFCURSOR()函数

原创 Oracle 作者:LuiseDalian 时间:2014-03-28 01:03:06 1 删除 编辑

DBMS_SQL

该包中定义了一个叫做SQL光标数的实体,它是一个整数,可以在调用边界传递它,也可以存储它。

你必须使用DBMS_SQL来执行动态SQL语句,当你不知道下面的信息之一时:

n  查询列表

n  在一个SELECTDML语句中什么占位符必须绑定

 

在下面的情形下你必须使用本地动态SQL,而不是使用DBMS_SQL包:

n  动态SQL语句获取行到记录中。

n  你想在执行INSERTUPDATEDELETE和返回1行结果的SELECT动态SQL语句后,使用SQL光标属性%FOUND, %ISOPEN, %NOTFOUND, or %ROWCOUNT

 

注意:可以远程调用DBMS_SQL子程序。

1DBMS_SQL.TO_REFCURSOR()函数

该函数可以将SQL光标数转换成一个弱的SQL光标变量,该光标变量可以在本地动态SQL中使用。在把SQL光标数传递给DBMS_SQL.TO_REFCURSOR()函数之前,你必须OPENPARSEEXECUTE它。

练习:从DBMS_SQL包转换为本地动态SQL

-- 11g12_07_06.sql

 

-- 定义类型

CREATE OR REPLACE TYPE TypeVarchar2Array IS TABLE OF VARCHAR2(200);

CREATE OR REPLACE TYPE TypeNumArray IS TABLE OF NUMBER;

 

 

-- 11g12_07_06.prc

CREATE OR REPLACE PROCEDURE do_query_1(

    placeHolder TypeVarchar2Array,

    bindVars    TypeVarchar2Array,

    sqlStmt     VARCHAR2

)

IS

    TYPE TypeCursor IS REF CURSOR;

    curSrc      TypeCursor;

    curID       NUMBER;

    bindNames   TypeVarchar2Array;

    empNos      TypeNumArray;

    depts       TypeNumArray;

    ret         NUMBER;

    isOpen      BOOLEAN;

BEGIN

    -- 打开SQL光标数

    curID := DBMS_SQL.OPEN_CURSOR;

    -- 解析SQL光标数

    DBMS_SQL.PARSE(curID, sqlStmt, DBMS_SQL.NATIVE);

    bindNames := placeHolder;

    -- 绑定变量

    FOR i IN 1 .. bindNames.COUNT LOOP

        DBMS_SQL.BIND_VARIABLE(curID, bindNames(i), bindVars(i));

    END LOOP;

    -- 运行SQL光标数

    ret := DBMS_SQL.EXECUTE(curID);

    -- DBMS_SQL 转换为本地动态SQL

curSrc := DBMS_SQL.TO_REFCURSOR(curID);

FETCH curSrc BULK COLLECT INTO empNos, depts;

FOR idx IN 1..empNos.COUNT LOOP

        dbms_output.put_line('员工编号: ' || empNos(idx) || ', ' || '部门编号: ' || depts(idx));

    END LOOP;

    -- 这个语句将会引起错误,因为curID被转换为REF CURSOR

    -- isopen := DBMS_SQL.IS_OPEN(curID);

    CLOSE curSrc;

END;

 

-- 11g12_07_06.tst

DECLARE

    vPlaceHolder TypeVarchar2Array;

    vBindVars    TypeVarchar2Array;

    vSQLStmt     VARCHAR2(200);

BEGIN

    vPlaceHolder := TypeVarchar2Array();

    vBindVars := TypeVarchar2Array();

    vSQLStmt := 'SELECT employee_id, department_id FROM employees WHERE employee_id <= :a';

    vPlaceHolder.Extend;

    vPlaceHolder(1) := 'a';

       

    vBindVars.Extend;

    vBindVars(1) := 103;

   

    do_query_1(vPlaceHolder, vBindVars, vSQLStmt);

END;  
 

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

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

注册时间:2012-02-06

  • 博文量
    1986
  • 访问量
    5678667