plsql

xiaoxiao2026-09-14  14

[color=red][size=x-large]PL/SQL学习[/size][/color] [color=blue]PL/SQL块语法:[/color] [DECLARE] --declaration statements BEGIN --executable statements [EXCEPTION] --exception statements END PL/SQL块中的每一条语句都必须以分号结束,SQL语句是多行的,但分号表示该语句的结束.一行中可以有多条SQL语句,它们之间以分号分隔.每一个PL/SQL块由Begin或Declare开始,以End结束.注释由 --标示. 变量赋值: 用":="符号 v_num number :=10; 注:dbms_output.put_line()不能打印boolean类型的值. [color=blue]PL/SQL实例[/color] SQL> set serveroutput on; SQL> begin 2 dbms_output.put_line('HelloWorld!'); 3 end; 4 / HelloWorld! PL/SQL 过程已成功完成。 [color=green]declare的实例:[/color] SQL> declare 2 v_name varchar2(20); 3 begin 4 v_name :='myname'; 5 dbms_output.put_line(v_name); 6 end; 7 / myname PL/SQL 过程已成功完成。 [color=green]declare exception 的实例:[/color] SQL> declare 2 v_num number :=0; 3 begin 4 v_num :=2/v_num; 5 dbms_output.put_line(v_num); 6 end; 7 / declare * 第 1 行出现错误: ORA-01476: 除数为 0 ORA-06512: 在 line 4 SQL> ed 已写入 file afiedt.buf 1 declare 2 v_num number :=0; 3 begin 4 v_num :=2/v_num; 5 dbms_output.put_line(v_num); 6 exception 7 when others then 8 dbms_output.put_line('error'); 9* end; SQL> / error PL/SQL 过程已成功完成。 PL/SQL变量的声明规则: [color=blue] 常用的变量类型:[/color] binary_integer :整数,主要用来计数而不是用来表示字段类型 number :数字类型 char :字长字符串 varchar2 :变长字符串 date :日期 long :长字符串,最长2GB boolean :布尔类型,可以取值为true,false 和null值. [color=green]变量声明,使用%type属性[/color] SQL> declare 2 v_empno number(4); 3 v_empno2 emp.empno%type; 4 v_empno3 v_empno2%type; 5 begin 6 dbms_output.put_line('HPJIANHUA'); 7 end; 8 / HPJIANHUA PL/SQL 过程已成功完成。 [color=green]--Table 变量类型:也是 自定义的变量类型[/color] 1 declare 2 type type_table_emp_empno is table of emp.empno%type index by binary_integer; 3 v_empnos type_table_emp_empno; 4 begin 5 v_empnos(0) :=4323; 6 v_empnos(2) :=2342; 7 v_empnos(-1) :=9999; 8 dbms_output.put_line(v_empnos(-1)); 9* end; SQL> / 9999 PL/SQL 过程已成功完成。 [color=green]--Record变量类型[/color] 1 declare 2 type type_record_dept is record 3 ( 4 deptno dept.deptno%type, 5 dname dept.dname%type, 6 loc dept.loc%type 7 ); 8 v_temp type_record_dept; 9 begin 10 v_temp.deptno :=52; 11 v_temp.dname :='hpjianhua'; 12 v_temp.loc :='HK'; 13 dbms_output.put_line(v_temp.deptno ||' '||v_temp.dname); 14* end; SQL> / 52 hpjianhua PL/SQL 过程已成功完成。 [color=green]--使用%rowtype声明record变量[/color] 1 declare 2 v_temp dept%rowtype; 3 begin 4 v_temp.dname :='hpjianhua'; 5 v_temp.deptno :=50; 6 v_temp.loc :='HK'; 7 dbms_output.put_line(v_temp.deptno ||' '||v_temp.dname); 8* end; SQL> / 50 hpjianhua [color=green]--SQL语句的使用:[/color] 1 declare 2 v_ename emp.ename%type; 3 v_sal emp.sal%type; 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno = 7369; 6 dbms_output.put_line(v_ename || ' ' || v_sal); 7* end; SQL> / SMITH 800 [color=green]--sql%rowcount的使用:[/color] 1 declare 2 v_deptno emp2.deptno%type :=10; 3 v_count number; 4 begin 5 --update emp2 set sal =sal/2 where deptno =v_deptno; 6 --select deptno into v_deptno from emp2 where empno = 7369; 7 dbms_output.put_line(sql%rowcount || '条记录被影响!'); 8 commit; 9* end; SQL> / 条记录被影响! PL/SQL 过程已成功完成。 [color=green]--PL/SQL的DDL语句:[/color] 建表: SQL> begin 2 execute immediate 'create table T(nn varchar2(20) default ''aaa'')'; 3 end; 4 / PL/SQL 过程已成功完成。 [color=green]--条件的语句:[/color] 实例: 1 declare 2 v_sal emp.sal%type; 3 begin 4 select sal into v_sal from emp 5 where empno = 7369; 6 if(v_sal<1200) then 7 dbms_output.put_line('low'); 8 elsif(v_sal < 2000) then 9 dbms_output.put_line('middle'); 10 else 11 dbms_output.put_line('high'); 12 end if; 13* end; SQL> / low PL/SQL 过程已成功完成。 [color=green]--循环语句:[/color] 实例: SQL> declare 2 i binary_integer :=1; 3 begin 4 loop 5 dbms_output.put_line(i); 6 i :=i+1; 7 exit when( i>=11); 8 end loop; 9 end; 10 / 1 2 3 4 5 6 7 8 9 10 PL/SQL 过程已成功完成。 [color=green]For循环:顺序与反序[/color] 实例: SQL> begin 2 for k in 1..10 loop 3 dbms_output.put_line(k); 4 end loop; 6 for k in reverse 1..10 loop 7 dbms_output.put_line(k); 8 end loop; 9 end; 10 / 1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1 PL/SQL 过程已成功完成。 错误处理: [color=green]太多记录数:[/color] 1 declare 2 v_temp number(4); 3 begin 4 select empno into v_temp from emp where deptno =10; 5 exception 6 when too_many_rows then 7 dbms_output.put_line('Too many records'); 8 when others then 9 dbms_output.put_line('error'); 10* end; SQL> / Too many records [color=green]没有数据:[/color] SQL> declare 2 v_temp number(4); 3 begin 4 select empno into v_temp from emp where empno = 2222; 5 exception 6 when no_data_found then 7 dbms_output.put_line('No data!'); 8 end; 9 / No data! 下面介绍一种DBA经常使用的方法: 创建一张表: SQL> create table errorlog 2 ( 3 id number primary key, 4 errcode number, 5 errmsg varchar2(1024), 6 errdate date 7 ); 表已创建。 [color=green]再创建一序列:[/color] SQL> create sequence seq_errorlog_id start with 1 increment by 1; 序列已创建。 1 declare 2 v_deptno dept.deptno%type :=10; 3 v_errcode number; 4 v_errmsg varchar2(1024); 5 begin 6 delete from dept where deptno =v_deptno; 7 commit; 8 exception 9 when others then 10 rollback; 11 v_errcode :=SQLCODE; 12 v_errmsg :=SQLERRM; 13 insert into errorlog values (seq_errorlog_id.nextval,v_errcode,v_errmsg,sys date); 14 commit; 15* end; SQL> / PL/SQL 过程已成功完成。 SQL> select * from errorlog; ID ERRCODE ---------- ---------- ERRMSG -------------------------------------------------------------------------------- ERRDATE -------------- 1 -2292 ORA-02292: 违反完整约束条件 (HPJIANHUA.FK_DEPTNO) - 已找到子记录 01-6月 -09 SQL> delete from dept where deptno = 10; delete from dept where deptno = 10 * 第 1 行出现错误: ORA-02292: 违反完整约束条件 (HPJIANHUA.FK_DEPTNO) - 已找到子记录 SQL> select to_char(errdate,'YYYY-MM-DD HH24:MI:SS') from errorlog; TO_CHAR(ERRDATE,'YY ------------------- 2009-06-01 19:38:59 注:SQL> select to_char(errdate,'YYYY-MM-DD HH24:MI:SS') from errorlog; 是格式化输出时间的查询. 引用:http://hpjianhua.iteye.com/blog/399868 相关资源:PLSQL Developer 8.0.3.1510 简体中文绿色破解版
转载请注明原文地址: https://www.6miu.com/read-5052673.html

最新回复(0)