STROF_CURSOR
接口/方法功能
关闭一个动态游标,参数为open_cursor所打开的游标,并释放内存。
接口/方法声明
DBMS_SQL.CLOSE_CURSOR(CURID in out integer);
参数说明
参数名称 | 参数类型 | 参数解释 | 默认值 |
---|---|---|---|
CURID | INTEGER | 动态游标整型ID值,= DBMS_SQL.OPEN_CURSOR | 无 |
操作示例
参见BIND_VARIABLE操作示例。
综合示例
建表
CREATE TABLE PHONE_INFOR( PHONE_NAME VARCHAR2(20), PRODUCER VARCHAR2(20), PRICE NUMBER );
利用DBMS_SQL执行DDL语句
CREATE OR REPLACE PROCEDURE CREATETABLE2(TABLENAME VARCHAR2) IS SQL_STRING VARCHAR2(1000);--存放SQL语句 V_CUR INTEGER;--定义整型变量,用于存放游标 BEGIN SQL_STRING := 'CREATE TABLE ' || TABLENAME || '(NAME VARCHAR(20))'; V_CUR := DBMS_SQL.OPEN_CURSOR;--打开游标 DBMS_SQL.PARSE(V_CUR,SQL_STRING,DBMS_SQL.NATIVE);--解析并执行SQL语句 DBMS_SQL.CLOSE_CURSOR(V_CUR);--关闭游标 END;
利用DBMS_SQL执行SELECT语句
DECLARE V_CURSOR NUMBER;--游标ID SQLSTRING VARCHAR2(200);--用于存放SQL语句 V_PHONE_NAME VARCHAR2(20);--手机名字 V_PRODUCER VARCHAR2(20);--手机生产商 V_PRICE NUMBER :=500;--手机价钱 V_COUNT INT;--在这里无意义,只是存放函数返回值 BEGIN --:P是占位符 --SELECT 语句中的第1列是PHONE_NAME,第2列是PRODUCER,第3列是PRICE SQLSTRING :='SELECT PHONE_NAME,PRODUCER,PRICE FROM PHONE_INFOR WHERE PRICE> :P'; V_CURSOR :=DBMS_SQL.OPEN_CURSOR;--打开游标; DBMS_SQL.PARSE(V_CURSOR ,SQLSTRING,DBMS_SQL.NATIVE);--解析动态SQL语句; --绑定输入参数,V_PRICE的值传给 :P DBMS_SQL.BIND_VARIABLE(V_CURSOR,':P',V_PRICE); --定义列,V_PHONE_NAME对应SELECT 语句中的第1列 DBMS_SQL.DEFINE_COLUMN(V_CURSOR,1,V_PHONE_NAME); --定义列,V_PRODUCER对应SELECT语句中的第2列 DBMS_SQL.DEFINE_COLUMN(V_CURSOR,2,V_PRODUCER); --定义列,V_PRICE对应SELECT语句中的第3列 DBMS_SQL.DEFINE_COLUMN(V_CURSOR,3,V_PRICE); V_COUNT := DBMS_SQL.EXECUTE(V_CURSOR);--执行动态SQL语句。 LOOP --从游标中把数据检索到缓存区(BUFFER)中,缓冲区的值只能被函数COULUMN_VALUE()所读取 EXIT WHEN DBMS_SQL.FETCH_ROWS(V_CURSOR)<=0; --函数COLUMN_VALUE()把缓冲区的列的值读入相应变量中。 --第1列的值被读入V_PHONE_NAME中 DBMS_SQL.COLUMN_VALUE(V_CURSOR,1,V_PHONE_NAME); --第2列的值被读入V_PRODUCER中 DBMS_SQL.COLUMN_VALUE(V_CURSOR,2,V_PRODUCER); --第2列的值被读入V_PRICE中 DBMS_SQL.COLUMN_VALUE(V_CURSOR,3,V_PRICE); --打印变量的值 DBMS_OUTPUT.PUT_LINE(V_PHONE_NAME || ' '||V_PRODUCER|| ' '||V_PRICE); END LOOP; DBMS_SQL.CLOSE_CURSOR(V_CURSOR);--关闭游标 END;
利用DBMS_SQL执行DML语句
DECLARE V_CURSOR NUMBER;--游标ID SQLSTRING VARCHAR2(200);--用于存放SQL语句 V_PHONE_NAME VARCHAR2(20);--手机名字 V_PRODUCER VARCHAR2(20);--手机生产商 V_PRICE NUMBER :=500;--手机价钱 V_COUNT INT;--被DML语句影响的行数 BEGIN SQLSTRING :='INSERT INTO PHONE_INFOR VALUES(:A,:B,:C)';-- :A,:B,:C 是占位符 V_PHONE_NAME :='S123'; V_PRODUCER :='索尼AA'; V_PRICE := 999; V_CURSOR :=DBMS_SQL.OPEN_CURSOR;--打开游标; DBMS_SQL.PARSE(V_CURSOR ,SQLSTRING,DBMS_SQL.NATIVE);--解析动态SQL语句; --绑定输入参数,V_PRICE的值传给 :P DBMS_SQL.BIND_VARIABLE(V_CURSOR,':A',V_PHONE_NAME); DBMS_SQL.BIND_VARIABLE(V_CURSOR,':B',V_PRODUCER); DBMS_SQL.BIND_VARIABLE(V_CURSOR,':C',V_PRICE); V_COUNT := DBMS_SQL.EXECUTE(V_CURSOR);--执行动态SQL语句。 DBMS_SQL.CLOSE_CURSOR(V_CURSOR);--关闭游标 DBMS_OUTPUT.PUT_LINE(' INSERT ' || TO_CHAR(V_COUNT) ||' ROW ');--打印插入行数 COMMIT; END;