BEGIN
SELECT first_name,last_name,zip INTO person_rec.name.first_name,person_rec.name.last_name,person_rec.zip FROM student where rownum<2;
END;
f.记录的集合
eg:
DECLARE
CURSOR name_cur IS SELECT first_name,last_name FROM student WHERE rownum<=4;
TYPE name_type IS TABLE OF name_cur%ROWTYPE INDEX BY BINARY_INTEGER;
name_tab name_type;
v_counter INTEGER :=0;
BEGIN
FOR name_rec IN name_cur LOOP
v_counter := v_counter+1;
name_tab(v_counter).first_name:=name_rec.first_name;
...
END LOOP;
END;
16.动态SQL
语法结构:
EXECUTE IMMEDIATE dynamic_SQL_string
[INTO defined_variable1,defined_variable2,...]
[USING [IN | OUT |IN OUT] bind_argument1,bind_argument2,...]
[{RETURNING | RETURN} field1,field2,... INTO bind_argument1,bind_argument2,...]
注:如果不指定USING的参数的任何模式,USING子句中所列出的所有绑定参数都是IN模式的。
当EXECUTE IMMEDIATE语句包含USING和RETURNING INTO子句时,USING子句只指定IN参数
动态SQL语句的结尾不应该是分号(;),类似地,动态PL/SQL语句块的结尾不能是右斜线(/)
17.批量SQL
a. FORALL语句
FORALL loop_counter IN bounds_clause
SQL_STATEMENT [SAVE EXCEPTION];
其中,bounds_clause是下面形式之一:
lower_limit..upper_limit
INDICES OF collection_name BETWEEN lower_limit..upper_limit
VALUES OF collection_name
如果VALUES OF子句中所使用的集合是联合数组,它必须使用PLS_INTEGER和BINARY_INTEGER进行索引
VALUES OF子句中所使用集合的元素必须是PLS_INTEGER或者BINARY_INTEGER
当VALUES OF子句所引用的集合是空时,FORALL语句会异常
eg:
DECLARE
TYPE row_num_type IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
row_num_tab row_num_type;
BEGIN
FOR i IN 1..10 LOOP
row_num_tab(i):=i;
END LOOP;
FOR ALL i IN 1..10
INSERT INTO TEST(row_num)VALUES(row_num_tab(i));
COMMIT;
END;
i>.SAVE EXCEPTION选项
此选项能够实现:即使当对应的SQL语句导致异常,FORALL语句仍旧能够继续执行。所产生的异常被存储在名为SQL%BULK_EXCEPTIONS的游标属性中。SQL%BULK_EXCEPTION游标属性是一个记录集合,
有两个字段组成:ERROR_INDEX和ERROR_CODE。ERROR_INDEX字段会存储发生异常的FORALL语句的迭代编号,ERROR_CODE会存储对应于所抛出异常的ORACLE错误代码,可以根据SQLERRM函数查询
错误码对应的错误信息
eg: FOR i in 1.. SQL%BULK_EXCEPTIONS.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('RECORD' || SQL%BULK_EXCEPTIONS(i).error_index ||'caused error'||i||':'||SQL%BULK_EXCEPTIONS(i).ERROR_CODE||' '||SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
END LOOP;
ii>.INDICES OF选项
FOR i IN 1..10 LOOP
row_num_tab(i):=i;
END LOOP;
row_num_tab.DELETE(1);
row_num_tab.DELETE(5);
row_num_tab.DELETE(7);
FORALL i IN INDICES OF row_num_tab
INSERT INTO TEST(ROW_NUM) VALUES(row_num_tab(i));
COMMIT;
由于删除1,5,7三个元素,故FORALL会迭代7次
iii>.VALU