PL_SQL基础编程
来源:互联网 发布:ubuntu apt安装路径 编辑:程序博客网 时间:2024/05/21 22:58
1、匿名语句块
DECLARE
flag NUMBER := 10;
BEGINfor i in 1..flag
loop
DBMS_OUTPUT.PUT_LINE('--------->' || i);
end loop;
END;
2、带游标的匿名语句块
DECLARE
cursor hbi_cursor
IS
select table_name,tablespace_name from user_tables where table_name like 'HBI%';
BEGIN
For hbi_table in hbi_cursor
loop
DBMS_OUTPUT.PUT_LINE('--------->' || hbi_table.table_name);
DBMS_OUTPUT.PUT_LINE('--------->' || hbi_table.tablespace_name);
end loop;
EXCEPTION
when no_data_found
then
DBMS_OUTPUT.PUT_LINE('--------->exception!!!');
END;
3、Anchored数据类型-基于某种数据库对象
DECLARE
fd_code BM$_Index.fd_code%type := 20;
fd_description BM$_Index.fd_description%type;
BEGIN
DBMS_OUTPUT.PUT_LINE('---------> ' || NVL(fd_code, 100));
DBMS_OUTPUT.PUT_LINE('---------> ' || NVL(fd_description, 'No description!!!'));
END;
4、嵌套语句块
DECLARE
e_show_exception_scope EXCEPTION;
v_student_id NUMBER := 123;
BEGIN
DBMS_OUTPUT.PUT_LINE('outer student id---------> ' || v_student_id);
DECLARE
v_student_id VARCHAR2(8) := 124;
BEGIN
DBMS_OUTPUT.PUT_LINE('inner student id---------> ' || v_student_id);
DBMS_OUTPUT.PUT_LINE('excetion ready open !!!!!!');
RAISE e_show_exception_scope;
DBMS_OUTPUT.PUT_LINE('excetion has open !!!!!!');
END;
EXCEPTION
when e_show_exception_scope
THEN
DBMS_OUTPUT.PUT_LINE('When am I displayed? outer student id--------->'|| v_student_id);
END;
5、select into语法
DECLARE
flag VARCHAR2(10);
BEGIN
select fd_code into flag from BM$_index where FD_CODE=2;
DBMS_OUTPUT.PUT_LINE('select into 向变量赋值--------->'|| flag);
END;
6、异常捕获及处理
BEGIN
insert into student(student_id)values(student_id_seq.nextval);
savepoint A;
insert into student(student_id)values(student_id_seq.nextval);
savepoint B;
insert into student(student_id)values(student_id_seq.nextval);
savepoint C;
commit;
exception when others then rollback;
RAISE_APPLICATION_ERROR(-20010, 'ERROR:插入数据失败!');
ROLLBACK TO B;
end;
7、if语句
DECLARE
v_num1 NUMBER := 0;
v_num2 NUMBER;
BEGIN
IF v_num1 = v_num2 THEN
DBMS_OUTPUT.PUT_LINE('v_num1 = v_num2');
ELSE
DBMS_OUTPUT.PUT_LINE('v_num1 != v_num2');
END IF;
END;
DECLARE
v_date DATE := TO_DATE('20-02-2013', 'DD-MM-YYYY');
v_day VARCHAR2(15);
BEGIN
v_day := RTRIM(TO_CHAR(v_date,'DAY'));
DBMS_OUTPUT.PUT_LINE('v_day------->' || v_day);
IF v_day IN ('星期三', 'SUNDAY') THEN
DBMS_OUTPUT.PUT_LINE(v_date || ' falls on weekend');
END IF;
DBMS_OUTPUT.PUT_LINE('Done...');
END;
DECLARE
v_student_grade NUMBER := 90;
v_letter_grade VARCHAR2(10);
BEGIN
if 90 <= v_student_grade and v_student_grade <= 100 THEN
v_letter_grade := 'A';
ELSIF v_student_grade BETWEEN 80 and 90 THEN
v_letter_grade := 'B';
ELSE
v_letter_grade := 'C';
END IF;
DBMS_OUTPUT.PUT_LINE('v_letter_grade---------->' || v_letter_grade);
EXCEPTION
WHEN others THEN
DBMS_OUTPUT.PUT_LINE('EXCEPTION----------> has open');
END;
8、case语句
DECLARE
v_num NUMBER := 21;
v_flag NUMBER;
BEGIN
v_flag := MOD(v_num, 2);
CASE v_flag
WHEN 0 THEN
DBMS_OUTPUT.PUT_LINE('v_num----------> is even number');
WHEN 1 THEN
DBMS_OUTPUT.PUT_LINE('v_num----------> is old number');
ELSE
DBMS_OUTPUT.PUT_LINE('v_num----------> is other number');
end CASE;
END;
SELECT YEAR,ROAD_CODE,ROAD_END-ROAD_START as ROAD_LENGTH,DIVISION_NAME,MANAGEMENTUNIT_FD_CODE,BM$_TechnicLevel.FD_DESCRIPTION as TECHNICLEVEL,${diradio},
case
when (select substr(indexvalue,1,instr(indexvalue,'-')-1) from HM_PM_INDEXEXCELLENT where Grade='1') < ${diradio} and
${diradio} <= (select substr(indexvalue,instr(indexvalue,'-')+1) from HM_PM_INDEXEXCELLENT where Grade='1') THEN '1'
when (select substr(indexvalue,1,instr(indexvalue,'-')-1) from HM_PM_INDEXEXCELLENT where Grade='2') < ${diradio} and
${diradio} <= (select substr(indexvalue,instr(indexvalue,'-')+1) from HM_PM_INDEXEXCELLENT where Grade='2') THEN '2'
when (select substr(indexvalue,1,instr(indexvalue,'-')-1) from HM_PM_INDEXEXCELLENT where Grade='3') < ${diradio} and
${diradio} <= (select substr(indexvalue,instr(indexvalue,'-')+1) from HM_PM_INDEXEXCELLENT where Grade='3') THEN '3'
when (select substr(indexvalue,1,instr(indexvalue,'-')-1) from HM_PM_INDEXEXCELLENT where Grade='4') < ${diradio} and
PQI <= (select substr(indexvalue,instr(indexvalue,'-')+1) from HM_PM_INDEXEXCELLENT where Grade='4') THEN '4'
when (select substr(indexvalue,1,instr(indexvalue,'-')-1) from HM_PM_INDEXEXCELLENT where Grade='5') < ${diradio} and
${diradio} <= (select substr(indexvalue,instr(indexvalue,'-')+1) from HM_PM_INDEXEXCELLENT where Grade='5') THEN '5'
ELSE '5' END grade from HM_PM_DETECTION_INDEX,BM$_TechnicLevel where IS_DEL='0' and HM_PM_DETECTION_INDEX.TECHNICLEVEL_FD_CODE=BM$_TechnicLevel.FD_CODE
9、循环
DECLARE
v_counter BINARY_INTEGER := 0;
BEGIN
loop
v_counter := v_counter + 1;
DBMS_OUTPUT.PUT_LINE('v_counter = ' || v_counter);
IF v_counter = 5 THEN
exit;
END IF;
end loop;
DBMS_OUTPUT.PUT_LINE('Done....');
END;
DECLARE
v_counter BINARY_INTEGER := 0;
BEGIN
loop
v_counter := v_counter + 1;
DBMS_OUTPUT.PUT_LINE('v_counter = ' || v_counter);
exit when v_counter = 10;
end loop;
DBMS_OUTPUT.PUT_LINE('Done....');
END;
DECLARE
v_counter BINARY_INTEGER := 10;
BEGIN
while v_counter > 2
loop
DBMS_OUTPUT.PUT_LINE('v_counter------->' || v_counter);
v_counter := v_counter - 1;
end loop;
DBMS_OUTPUT.PUT_LINE('Done....');
END;
BEGIN
for v_counter in reverse 1..10 loop
DBMS_OUTPUT.PUT_LINE('v_counter------>' || v_counter);
end loop;
END;
BEGIN
for v_counter in reverse 1..10 loop
if mod(v_counter,2) = 1 THEN continue;
end if;
DBMS_OUTPUT.PUT_LINE('v_counter------>' || v_counter);
end loop;
END;
BEGIN
for v_counter in reverse 1..10 loop
for v_inner_counter in 1..2 loop
DBMS_OUTPUT.PUT_LINE('v_inner_counter------>' || v_inner_counter);
end loop;
DBMS_OUTPUT.PUT_LINE('v_counter------>' || v_counter);
end loop;
END;
10、异常
BEGIN
for v_counter in reverse 1..10 loop
for v_inner_counter in 1..2 loop
DBMS_OUTPUT.PUT_LINE('v_inner_counter------>' || v_inner_counter);
end loop;
DBMS_OUTPUT.PUT_LINE('v_counter------>' || v_counter);
end loop;
raise_application_error(-20000,'an error has open!!!');
END;
11、游标
DECLARE
cursor BM$_INDEX_CURSOR is
select * from BM$_INDEX where ROWNUM < 4;
BEGIN
for bm in BM$_INDEX_CURSOR loop
DBMS_OUTPUT.PUT_LINE('fd_code-------->' || bm.FD_CODE);
end loop;
end;
DECLARE
v_fd_code BM$_INDEX.FD_CODE%TYPE;
cursor BM$_INDEX_CURSOR is
select fd_code from BM$_INDEX where ROWNUM < 4;
BEGIN
open BM$_INDEX_CURSOR;
loop
FETCH BM$_INDEX_CURSOR into v_fd_code;
exit when BM$_INDEX_CURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('fd_code-------->' || v_fd_code);
end loop;
close BM$_INDEX_CURSOR;
EXCEPTION
WHEN others THEN
IF BM$_INDEX_CURSOR%ISOPEN THEN
close BM$_INDEX_CURSOR;
END if;
end;
DECLARE
cursor BM$_INDEX_CURSOR is
select * from BM$_INDEX where ROWNUM < 4;
row_index BM$_INDEX_CURSOR%ROWTYPE;
BEGIN
open BM$_INDEX_CURSOR;
loop
FETCH BM$_INDEX_CURSOR into row_index;
exit when BM$_INDEX_CURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('fd_code-------->' || row_index.fd_code);
end loop;
close BM$_INDEX_CURSOR;
EXCEPTION
WHEN others THEN
IF BM$_INDEX_CURSOR%ISOPEN THEN
close BM$_INDEX_CURSOR;
END if;
end;
--带参数的游标
DECLARE
cursor BM$_INDEX_CURSOR(v_row_num IN INTEGER) is
select * from BM$_INDEX where ROWNUM < v_row_num;
row_index BM$_INDEX_CURSOR%ROWTYPE;
BEGIN
open BM$_INDEX_CURSOR(6);
loop
FETCH BM$_INDEX_CURSOR into row_index;
exit when BM$_INDEX_CURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('fd_code-------->' || row_index.fd_code);
end loop;
close BM$_INDEX_CURSOR;
EXCEPTION
WHEN others THEN
IF BM$_INDEX_CURSOR%ISOPEN THEN
close BM$_INDEX_CURSOR;
END if;
end;
--for update(更新游标数据) , where current
DECLARE
cursor BM$_INDEX_CURSOR is
select * from BM$_INDEX where ROWNUM < 4 for update;
row_index BM$_INDEX_CURSOR%ROWTYPE;
BEGIN
open BM$_INDEX_CURSOR;
loop
FETCH BM$_INDEX_CURSOR into row_index;
exit when BM$_INDEX_CURSOR%NOTFOUND;
update row_index set fd_code=10;
end loop;
close BM$_INDEX_CURSOR;
EXCEPTION
WHEN others THEN
IF BM$_INDEX_CURSOR%ISOPEN THEN
close BM$_INDEX_CURSOR;
END if;
end;
12、触发器
--语法
CREATE [OR REPLACE] TRIGGER Ttirgger_name
[BEFORE|AFTER] INSERT OR UPDATE OR DELETE ON table_name
[FOR EACH ROW]
[FOLLOWS another_trigger]
[ENABLE/DISABLE]
[WHEN condition]
DECLARE
declaration statements
BEGIN
excutable statements
EXCEPTION
exception-handling statements
END;
--BEFORE触发器
CREATE OR REPLACE TRIGGER student_bi
BEFORE INSERT ON student
FOR EACH ROW
BEGIN
:NEW.student_id := STUDENT_ID_SEQ.NEXTVAL;
:NEW.created_by := USER;
:NEW.created_date := SYSDATE;
:NEW.modified_by := USER;
:NEW.modified_date := SYSDATE;
END;
CREATE OR REPLACE TRIGGER section_biu
BEFORE INSERT OR UPDATE ON section
FOR EACH ROW
DECLARE
v_total NUMBER;
v_name VARCHAR2(30);
BEGIN
select count(*) into v_total from section where instructor_id = :NEW.instrutor_id;
if v_total >= 10 then select first_name || ' ' || last_name INTO v_name from instructor where instructor_id = :NEW.instructor_id;
RAISE_APPLICATION_ERROR(-2000,'Instructor, '||v_name||',is overbooked');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND then
RAISE_APPLICATION_ERROR(-20001,'This is not a valid instructor');
END;
13、集合
--集合概念和java里面的数据概念一样
--语法
DECLEAR
TYPE last_name_type is TABLE OF student.last_name%TYPE INDEX BY BINARY_INTEGER;
last_name_tab last_name_type;
DECLARE
cursor fd_code_cur is
select fd_code from BM$_INDEX;
TYPE fd_code_type is TABLE OF BM$_INDEX.fd_code%TYPE INDEX BY BINARY_INTEGER;
fd_code_tab fd_code_type;
v_counter INTEGER := 0;
BEGIN
FOR code IN fd_code_cur loop
v_counter := v_counter + 1;
fd_code_tab(v_counter) := code.fd_code;
DBMS_OUTPUT.PUT_LINE('fd_code ' || v_counter || ': ' || fd_code_tab(v_counter));
END LOOP;
END;
--select * from BM$_InDEX
--变长数组
DECLARE
type varray_type is Varray(10) of number;
v_varray varray_type := varray_type(1,2,3,4,5,6);
BEGIN
DBMS_OUTPUT.PUT_LINE('v_varray.count ' || v_varray.COUNT);
DBMS_OUTPUT.PUT_LINE('v_varray.LIMIT ' || v_varray.LIMIT);
DBMS_OUTPUT.PUT_LINE('v_varray.FIRST ' || v_varray.FIRST);
DBMS_OUTPUT.PUT_LINE('v_varray.LAST ' || v_varray.LAST);
v_varray.EXTEND(2,4);
DBMS_OUTPUT.PUT_LINE('v_varray.LAST ' || v_varray.LAST);
DBMS_OUTPUT.PUT_LINE('v_varray( ' || v_varray.LAST ||')=' || v_varray(v_varray.LAST));
END;
14、记录
--基于表的记录
DECLARE
v_index BM$_INDEX%ROWTYPE;
BEGIN
select * into v_index from BM$_INDEX where fd_code=1;
DBMS_OUTPUT.PUT_LINE('v_index.fd_code: ' || v_index.fd_code);
END;
--基于游标的记录
DECLARE
CURSOR index_cur IS select * from BM$_INDEX;
v_index index_cur%ROWTYPE;
BEGIN
OPEN index_cur;
LOOP
FETCH index_cur INTO v_index;
EXIT WHEN index_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('v_index.fd_code: ' || v_index.fd_code);
END LOOP;
END;
15、动态sql
--执行动态sql
DECLARE
sql_stmt VARCHAR2(100);
BEGIN
sql_stmt := 'CREATE TABLE my_test as select * from BM$_INDEX where fd_code=1';
execute IMMEDIATE sql_stmt;
END;
DECLARE
sql_stmt VARCHAR2(100);
v_total NUMBER;
BEGIN
--sql_stmt := 'CREATE TABLE my_test as select * from BM$_INDEX';
execute IMMEDIATE 'select count(*) from BM$_INDEX' into v_total;
DBMS_OUTPUT.PUT_LINE('v_total: ' || v_total);
END;
- PL_SQL基础编程
- PL_SQL基础
- PL_SQL基础--续
- PL_SQL基础--续二
- PL_SQL基础--续三
- PL_SQL基础--续四
- PL_SQL基础--续五
- PL_SQL基础--续六
- Oracle常用命令08(pl_sql编程)
- pl_sql
- pl_sql
- Oracle常用命令09(pl_sql编程2)
- pl_sql 游标
- PL_SQL注册码
- PL_SQL 复习笔记
- PL_SQL笔记(1)(转载)
- Oracle PL_SQL语句总结
- PL_SQL 权限不足
- mysql与其他数据库比较
- 同时启动两个tomcat
- android 基础知识(Environment)
- MVC 音乐商店 第 7 部分: 会员资格和授权
- POST请求中URL需要编码吗?
- PL_SQL基础编程
- mysql适用场景
- Jasperreports 中文显示
- 解决Flex多文件上传进度条不刷新问题
- java的一些容易出错的地方!
- Windows XP + VC 6.0 + WinXP_DDK + DriverStudio 3.2
- mvc与三层结构终极区别
- Qt连接QSqlite数据库,使用QTableWidget显示数据总结
- .NET(C#):谈谈各种结束进程的方法