DECLARE
-- 声明引用游标
TYPE cur_name IS REF CURSOR;
--声明这个游标的具体变量
c_var cur_name;
-- 声明存放标的数据类型
TYPE table_info IS TABLE OF t93%ROWTYPE INDEX BY
BINARY_INTEGER;
--声明已个具体变量
table_var table_info;
-- 声明存放某张表的 行类型变量
col_var t93%ROWTYPE;
BEGIN
-- 打开引用游标指向某个表
OPEN c_var FOR SELECT * FROM t93;
-- 循环取得数据
LOOP
FETCH c_var INTO col_var;
EXIT WHEN c_var%NOTFOUND;
dbms_output.put_line(col_var.name);
END LOOP;
-- bulk collect 取得游标指向表的所有数据
-- fetch c_var bulk collect into
table_var;
-- for i in table_var.first ..
table_var.last loop;
--
dbms_output.put_line(table_var(i).name);
-- end loop;
CLOSE c_var;
END;
ORACLE 区分硬编译和软编译 差异在于执行的SQL 代码是否完全一致
execute 执行 immediate 立即
硬编译
DECLARE
BEGIN
EXECUTE IMMEDIATE 'update t93 set id = id+20
where id ='|| &ID;
END;
软编译
DECLARE
var_info INT;
str VARCHAR2(200);
BEGIN
var_info :=
&ID;
str := 'upedate t93 set id
=:var where id =:x'
EXECUTE IMMEDIATE str USING
100,var_info;
COMMIT;
END;
动态SQL 是指在PL/SQL程序执行时生成的SQL语句
PL/SQL
↓
检查共享池是否有相同SQL语句
没有就继续 有就返回
↓
检查语法 ←
检查PL/SQL代码的语法或编译错误
↙
↘
绑定
检查对表 列对象的引用
↓
产生伪代码 并设置合法状态
SQL执行过程
检查SQL 语句 在SGA
中的共享池中是否存在
如果不存在 则编译
解析后执行 :硬解析
如果存在
则取出编译结果执行 :软解析