DBMS_SQL包
该包中定义了一个叫做SQL光标数的实体,它是一个整数,可以在调用边界传递它,也可以存储它。
你必须使用DBMS_SQL来执行动态SQL语句,当你不知道下面的信息之一时:
n 查询列表
n 在一个SELECT或DML语句中什么占位符必须绑定
在下面的情形下你必须使用本地动态SQL,而不是使用DBMS_SQL包:
n 动态SQL语句获取行到记录中。
n 你想在执行INSERT、UPDATE、DELETE和返回1行结果的SELECT动态SQL语句后,使用SQL光标属性%FOUND, %ISOPEN, %NOTFOUND, or %ROWCOUNT
注意:可以远程调用DBMS_SQL子程序。
(1)DBMS_SQL.TO_REFCURSOR()函数
该函数可以将SQL光标数转换成一个弱的SQL光标变量,该光标变量可以在本地动态SQL中使用。在把SQL光标数传递给DBMS_SQL.TO_REFCURSOR()函数之前,你必须OPEN、PARSE和EXECUTE它。
练习:从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/