动态游标 REF动态游标,用于处理多行的查询结果集,在 打开游标是才确定类型 特点: 1、动态游标可以与不同的语句关联 2、打开游标是绑定、是REF类型 3、常用在存储过程中 使用过程 定义游标 TYPE <类型名> IS REF COUSER RETURN <返回类型名> 声明游标 <游标名> <类型名> 打开动态游标 OPEN <游标名> FOR <查询语句> //=================实例================= DECLARE TYPE refcur IS REF COUSOR RETURN employees%ROWTYPE v_emp employees%ROWTYPE BEGIN OPEN refcur FOR --SQL语句 LOOP FETCH refcur INTO v_emp; EXIT WHEN refcur%NOTFOUND; --执行语句 END LOOP CLOSE refcur END
EXECUTE IMMEDIATE '语句' [INTO <变量序列>] --用于接收SQL的查询结果 [USING <参数序列>] --用于动态接收参数 //============实例================ EXECUTE IMMEDIATE 'CREATE TABLE bonus (id NUMBER, amt NUMBER)'
DECLARE sql_stmt VARCHAR2(200) emp_id NUMBER(10) := XX; emp_rec enployees%ROWTYPE; BEGIN sql_stmt := 'select * from employees where id = :id' EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id; END; [注]只能执行返回结果为一行或者没有的语句 当返回多行时需要使用REF游标 OPEN <游标> FOR [USING <参数列表>] SQL行列转换 静态语句 SELECT t_name 姓名, sum(CASE t_sourse WHEN '语文' THEN t_score ELSE 0 END) 语文, sum(CASE t_sourse WHEN '数学' THEN t_score ELSE 0 END) 数学, sum(CASE t_sourse WHEN '物理' THEN t_score ELSE 0 END) 物理, FORM td GROUP BY t_name;
动态语句 DECLARE t_name VARCHAR(10); t_coures1 NUMBER; t_coures2 NUMBER; t_coures3 NUMBER; TYPR c_type IS REF CURSOR; cur c_type; BEGIN OPEN cur FOR 'sum (case t_course when ''' || ' 语文' || ''' then t_score else 0 end ) , sum (case t_course when ''' || ' 数学' || ''' then t_score else 0 end ) , sum (case t_course when ''' || ' 物理' || ''' then t_score else 0 end ) FROM td GROUP BY t_name' LOOP FETCH cur INTO t_name,t_course1,t_course2,t_course3 EXIT WHEN cur%NOTFOUND; END LOOP; CLOSE cur; END;