Skip to content

STROF_CURSOR

接口/方法功能

关闭一个动态游标,参数为open_cursor所打开的游标,并释放内存。

接口/方法声明

DBMS_SQL.CLOSE_CURSOR(CURID in out integer);

参数说明

参数名称参数类型参数解释默认值
CURIDINTEGER动态游标整型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;