PL_SQL基础编程

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;

发布了36 篇原创文章 · 获赞 3 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/jinxiumeihappy/article/details/12613847