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

DBMS_SQL

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

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

查询列表

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

 

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

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

你想在执行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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17013648/viewspace-1131202/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值