PL/SQL 实例总结

--PL/SQL 保证输出
SET serveroutput ON

--PL/SQL 块
DECLARE
	v_sal emp.sal%type;
BEGIN
	SELECT sal INTO v_sal FROM emp WHERE empno=7369;
	dbms_output.put_line(v_sal);
END;

--PL/SQL 记录类型
DECLARE
	type emp_record IS record(
		v_ename emp.ename%type,
		v_sal emp.sal%type
	);
	v_emp emp_record;
BEGIN
	SELECT ename , sal INTO v_emp FROM emp WHERE empno=7369;
	dbms_output.put_line(v_emp.v_ename||' , '||v_emp.v_sal);
END;

--PL/SQL 流程控制
DECLARE
	v_sal emp.sal%type;
	v_temp varchar2(32);
BEGIN
	SELECT sal INTO v_sal FROM emp WHERE empno=7369;			
		IF v_sal >=3000 THEN v_temp := 'sal>=3000';
		ELSIF v_sal >=1000 THEN v_temp :='1000<=sal<3000'; 
		ELSE v_temp :='sal<1000';
		END IF;
	dbms_output.put_line(v_temp);
END;

--PL/SQL 游标
DECLARE
	CURSOR emp_cursor IS SELECT ename , sal  FROM emp WHERE deptno=10;
BEGIN
	FOR c IN emp_cursor LOOP
		 dbms_output.put_line(c.ename||' , '||c.sal);
		 END LOOP;
END;

DECLARE
	CURSOR emp_cursor IS SELECT empno , sal  FROM emp WHERE deptno=10;
		v_temp number(4,2);
BEGIN
      FOR c IN emp_cursor LOOP
			    IF c.sal >=3000 THEN v_temp := 0.03;
			    ELSIF c.sal >=1000 THEN v_temp :=0.02; 
			    ELSE v_temp :=0.01;
			    END IF;
					UPDATE emp SET sal = c.sal * (1+v_temp) WHERE empno =c.empno;
      END LOOP;
END;

--PL/SQL 隐式游标
BEGIN
	UPDATE emp SET sal = sal+10 WHERE empno='7882';
	IF sql%notfound THEN dbms_output.put_line('查无此人');
			END IF;
END;

--PL/SQL 异常
DECLARE
    v_sal emp.sal%type;
BEGIN
      SELECT sal INTO v_sal FROM emp WHERE deptno=10;
      dbms_output.put_line(v_sal);
EXCEPTION
	    WHEN too_many_rows THEN dbms_output.put_line('返回多行!');
END;

--PL/SQL 存储函数
CREATE OR REPLACE FUNCTION function_helloword(v_name varchar2)
RETURN varchar2
IS
BEGIN
	     RETURN 'hello '||v_name;
END;

BEGIN
	     dbms_output.put_line(function_helloword(' word!'));
END;
----------
create or replace function function_emp_total(v_deptno number,v_sumemp out number)
return number
is
          v_sumsal number  := 0;
					cursor emp_cursor is select sal from emp where deptno =  v_deptno;
begin
	        v_sumemp := 0;
					for c in emp_cursor loop
					v_sumsal := v_sumsal+c.sal;
					v_sumemp :=v_sumemp+1;
					end loop;
	        return v_sumsal;
end;

declare
    v_sumemp number := 0;
begin
	     dbms_output.put_line(function_emp_total(10,v_sumemp));
			 dbms_output.put_line(v_sumemp);
end;

--PL/SQL 存储过程
create or replace procedure procedure_emp_total(v_deptno number,v_sumsal out number)
is
					cursor emp_cursor is select sal from emp where deptno =  v_deptno;
begin
	        v_sumsal := 0;
					for c in emp_cursor loop
					v_sumsal := v_sumsal+c.sal;
					end loop;
	       dbms_output.put_line(v_sumsal);
end;

declare
    v_sumsal number := 0;
begin
	     procedure_emp_total(10,v_sumsal);
end;

--PL/SQL 触发器
create or replace trigger trigger_updateemp
after
          update on emp
		for each row
begin 
          dbms_output.put_line('helloword');	
end;


update emp set sal =sal+100 where deptno=10;


--游标变量
create or replace procedure CREATEREPORT(a_checkDate in varchar2) is
			v_reportkey VARCHAR2(128) ; 	--报告编号
			v_udsi VARCHAR2(4) ; 
		--游标变量	
			 type Ref_udsi is ref cursor;
			 cursor_udsi Ref_udsi;
  --定义游标
	CURSOR cursor_party IS
      SELECT DISTINCT A.PARTY_ID
      FROM PR11_PARTY_UDSI_TRANS A
      WHERE A.CREATE_DATE = TO_DATE(a_checkDate,'YYYY-MM-DD')
       AND A.UDSI != '1102' ; 
      
begin
	     FOR P IN cursor_party LOOP
         v_reportkey := 'B'||trim(to_char(PR11_REPORT_SEQ.nextval,'00000000'));  --报告编号
 
        --主体触发的规则
			 open cursor_udsi for 
			 	SELECT A.UDSI
				FROM PR11_PARTY_UDSI_TRANS A
				WHERE A.CREATE_DATE = TO_DATE(a_checkDate,'YYYY-MM-DD')
				AND A.UDSI != '1102'
				AND A.PARTY_ID = p.party_id ;
			 loop
			fetch cursor_udsi into v_udsi;
			 exit when cursor_udsi%notfound;
			 dbms_output.put_line(v_udsi);		
					
			 END loop;
			 
       END LOOP;
end;

PL/SQL编程 pl/sql(procedural language/sql)是Oracle在标准的sql语言上的扩展。pl/sql不仅允许嵌入式sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误。这样使得他的功能变的更强大。缺点是移植性不好。 编写一个存储过程,向表中添加数据。 1. create table mytest (name varchar2(30),passwd varchar2(30)); 2. create or replace procedure xxc_pro1 is begin insert into mytest values ('小红','m123'); end; 3. 调用过程 exec 过程名(参数1,参数2…)或call 过程名参数1,参数2…) ① exec xxc_pro1; 或者是 ② call xxc_pro1; pl/sql可以做什么? 块:包括过程、函数、触发器、包。 编写规范: 1. 注释 --:单行注释 eg:select * from emp where empno=7788;--取得员工信息 /*……*/多行注释 2. 表示符号(变量)的命名规范: ① 当定义变量时,建议用v_作为前缀:v_ename ② 当定义常量时,建议用c_作为前缀:c_rate ③ 当定义游标时,建议用_cursor作为后缀:emp_cursor ④ 当定义例外时,建议用e_作为前缀:e_error 块(block)是pl/sql的今本程序单元,编写pl/sql程序实际上就是在编写pl/sql块;pl/sql块由三部分组成:定义部分,执行部分,例外处理部分。 declare --可选部分 /*定义部分:定义常量,变量,游标,例外,复杂数据类型*/ begin --必选部分 /*执行部分:要执行的pl/sql语句和sql语句*/ exception --可选部分 /*例外处理部分:处理运行的各种错误*/ 实例1:只包含执行部分的pl/sqlSQL> set serveroutput on --打开输出 SQL> begin 2 dbms_output.put_line('hello'); 3 end; 4 / 说明:dbms_output是oracle提供的包,该包包含一些过程,put_line就是其中之一。 实例2:包含定义部分和执行部分 SQL> declare 2 v_ename varchar2(5); 3 begin 4 select ename into v_ename from emp where empno = &no; 5 dbms_output.put_line('雇员名'||v_ename); 6 end; 7 / 说明:&:从控制台输入变量,会弹出一个对话框。 实例3.同时输出雇员名和工资 SQL> declare 2 v_ename varchar2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno=&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 end; 8 / 包含定义,执行,和例外处理的pl/sql块。 实例4.当输入的员工号不存在时 SQL> declare 2 v_ename varchar2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno =&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 exception --异常处理部分 8 when no_data_found then 9 dbms_output.put_line('请输入正确的员工号!'); 10 end; 11 / 以上为块的基础,下面来介绍块的各个组成:过程,函数,触发器,包。 过程 过程用于执行特定的操作,当执行过程的时候,可以指定输入参数(in),也可以指定输出参数(out)。通过在过程中使用输入参数,可以讲数据输入到执行部分,通过使用输出参数,可以将执行部分的数据输出到应用环境,在pl/sql中可以使用create procedure命令来创建过程。 编写一个存储过程,可以输入雇员名和新工资来改变员工工资。 --案例 create or replace procedure xxc_pro3(newname in varchar2,newsal in number) is begin update emp set sal=newsal where ename=newname; end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值