`
121059457
  • 浏览: 23235 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

学习笔记:18pl/sql过程

SQL 
阅读更多
18-1:建立无参数的过程
	CREATE OR REPLACE PROCEDURE out_time
	IS
	BEGIN
	  dbms_session.set_nls('NLS_DATE_FORMAT',
	    '''YYYY-MM-DD HH24:MI:SS''');
	  dbms_output.put_line(sysdate);
	END;
	/
18-2:建立有输入参数的过程
	CREATE OR REPLACE PROCEDURE add_emp(
	  empno emp.empno%TYPE,ename emp.ename%TYPE,
	  job emp.job%TYPE,mgr emp.mgr%TYPE,
	  hiredate emp.hiredate%TYPE,sal emp.sal%TYPE,
	  comm emp.comm%TYPE,deptno emp.deptno%TYPE)
	IS
	BEGIN
	  INSERT INTO emp
	    VALUES(empno,ename,job,mgr,hiredate,sal,comm,deptno);
	END;
	/
18-3:建立有输出参数的过程
	CREATE OR REPLACE PROCEDURE update_sal
	(eno NUMBER,salary NUMBER,name OUT VARCHAR2) IS
	BEGIN
	  UPDATE emp SET sal=salary WHERE empno=eno
	  RETURNING ename INTO name;
	END;
	/
18-4:建立有输入输出参数的过程
	CREATE OR REPLACE PROCEDURE divide
	(num1 IN OUT NUMBER,num2 IN OUT NUMBER) IS
	  v1 NUMBER;
	  v2 NUMBER;
	BEGIN
	  v1:=TRUNC(num1/num2);
	  v2:=MOD(num1,num2);
	  num1:=v1;
	  num2:=v2;
	END;
	/
18-5:调用无参数的过程
	set serveroutput on
	exec out_time
18-6:调用带有输入参数的过程
	exec add_emp(1111,'MARY','CLERK',7369,SYSDATE,1200,null,30)
18-7:调用带有输出参数的过程
	DECLARE
	  v_name emp.ename%TYPE;
	BEGIN
	  update_sal(&eno,&salary,v_name);
	  dbms_output.put_line('姓名:'||v_name);
	END;
	/
18-8:调用带有输入输出参数的过程
	DECLARE
	  n1 NUMBER:=&n1;
	  n2 NUMBER:=&n2;
	BEGIN
	  divide(n1,n2);
	  dbms_output.put_line('商:'||n1||',余数:'||n2);
	END;
	/
18-9:使用位置传递为参数传递变量和数据
	CALL add_emp(2222,'MIKE',NULL,NULL,SYSDATE,800,NULL,30);
18-10:使用名称传递为参数传递变量和数据
	exec add_emp(empno=>3333,hiredate=>null,ename=>'JOHN',job=>NULL,mgr=>null,sal=>NULL,comm=>null,deptno=>null)
18-11:使用组合传递为参数传递变量和数据
	exec add_emp(4444,'AGASI','CLERK',NULL,hiredate=>SYSDATE,sal=>1200,comm=>0,deptno=>30)
18-12:为过程参数指定默认值
	CREATE OR REPLACE PROCEDURE add_emp(
	  empno emp.empno%TYPE,ename emp.ename%TYPE,
	  job emp.job%TYPE DEFAULT 'CLERK',mgr emp.mgr%TYPE,
	  hiredate emp.hiredate%TYPE DEFAULT SYSDATE,
	  sal emp.sal%TYPE DEFAULT 1000,
	  comm emp.comm%TYPE DEFAULT 0,deptno emp.deptno%TYPE)
	IS
	BEGIN
	  INSERT INTO emp VALUES(empno,ename,job,mgr,hiredate,sal,comm,deptno);
	END;
	/
	exec add_emp(5555,'BUSH',mgr=>7788,deptno=>30)
18-13:使用异常处理
	CREATE OR REPLACE PROCEDURE update_sal(
	  name emp.ename%TYPE,salary emp.sal%TYPE) IS
	  e_no_rows EXCEPTION;
	BEGIN
	  UPDATE emp SET sal=salary WHERE LOWER(ename)=LOWER(name);
	  IF SQL%NOTFOUND THEN
	    RAISE e_no_rows;
	  END IF;
	EXCEPTION
	  WHEN e_no_rows THEN
	    DBMS_OUTPUT.PUT_LINE('该雇员不存在');
	END;
	/
18-14:自定义错误信息
	CREATE OR REPLACE PROCEDURE add_emp(
	  empno emp.empno%TYPE,ename emp.ename%TYPE,
	  job emp.job%TYPE DEFAULT 'CLERK',mgr emp.mgr%TYPE,
	  hiredate emp.hiredate%TYPE DEFAULT SYSDATE,
	  sal emp.sal%TYPE DEFAULT 1000,
	  comm emp.comm%TYPE DEFAULT 0,deptno emp.deptno%TYPE)
	IS
	  e_2291 EXCEPTION;
	  PRAGMA EXCEPTION_INIT(e_2291,-2291);
	BEGIN
	  CASE
	    WHEN job NOT IN ('CLERK','MANAGER','ANALYST','SALESMAN') THEN
	      RAISE_APPLICATION_ERROR(-20000,'雇员岗位只能是CLERK'
	        ||'、MANAGER、ANALYST或者SALESMAN');
	    WHEN sal NOT BETWEEN 1000 AND 5000 THEN
	      RAISE_APPLICATION_ERROR(-20001,'工资必须在1000到5000之间');
	    ELSE
	      INSERT INTO emp
	        VALUES(empno,ename,job,mgr,hiredate,sal,comm,deptno);
	  END CASE;
	EXCEPTION
	  WHEN DUP_VAL_ON_INDEX THEN
	    RAISE_APPLICATION_ERROR(-20002,'雇员号不能重复');
	  WHEN e_2291 THEN
	    RAISE_APPLICATION_ERROR(-20003,'部门号不存在');
	END;
	/
18-15:使用纪录变量作为输入参数
	CREATE OR REPLACE PROCEDURE add_dept(
	  dept_record dept%ROWTYPE) IS
	BEGIN
	  INSERT INTO dept VALUES dept_record;
	EXCEPTION
	  WHEN DUP_VAL_ON_INDEX THEN
	    RAISE_APPLICATION_ERROR(-20012,'部门号不能重复');
	END;
	/
	DECLARE
	  dept_record dept%ROWTYPE;
	BEGIN
	  dept_record.deptno:=&dno;
	  dept_record.dname:='&name';
	  dept_record.loc:='&loc';
	  add_dept(dept_record);
	END;
	/
18-16:使用纪录变量作为输出参数
	CREATE OR REPLACE PROCEDURE get_employee(
	  eno emp.empno%TYPE,emp_record OUT emp%ROWTYPE) IS
	BEGIN
	  SELECT * INTO emp_record FROM emp WHERE empno=eno;
	EXCEPTION
	  WHEN NO_DATA_FOUND THEN
	    RAISE_APPLICATION_ERROR(-20000,'雇员不存在');
	END;
	/
	DECLARE
	  emp_record emp%ROWTYPE;
	BEGIN
	  get_employee(&eno,emp_record);
	  dbms_output.put_line('姓名:'||emp_record.ename||',工资:'||emp_record.sal);
	END;
	/
18-17:使用集合变量作为输入参数
	CREATE TYPE deptno_table_type IS TABLE OF NUMBER(2);
	/
	CREATE TYPE dname_table_type IS TABLE OF VARCHAR2(10);
	/
	CREATE TYPE loc_table_type IS TABLE OF VARCHAR2(20);
	/
	CREATE OR REPLACE PROCEDURE add_department(
	  deptno_table deptno_table_type,
	  dname_table dname_table_type,loc_table loc_table_type)
	IS
	BEGIN
	  FORALL i IN 1..deptno_table.COUNT
	    INSERT INTO dept VALUES
	      (deptno_table(i),dname_table(i),loc_table(i));
	EXCEPTION
	  WHEN DUP_VAL_ON_INDEX THEN
	    RAISE_APPLICATION_ERROR(-20012,'部门号不能重复');
	END;
	/
	DECLARE
	  deptno_table deptno_table_type:=deptno_table_type(60,70,80);
	  dname_table dname_table_type :=dname_table_type('计划处','质量处','技术处');
	  loc_table loc_table_type:=loc_table_type('呼和浩特','包头','乌海');
	BEGIN
	  add_department(deptno_table,dname_table,loc_table);
	END;
	/
18-18:使用集合变量作为输出参数
	CREATE TYPE ename_table_type IS TABLE OF VARCHAR2(10);
	/
	CREATE TYPE job_table_type IS TABLE OF VARCHAR2(10);
	/
	CREATE OR REPLACE PROCEDURE get_emp(
	  dno NUMBER,ename_table OUT ename_table_type,
	  job_table OUT job_table_type) IS
	BEGIN
	  SELECT ename,job BULK COLLECT INTO ename_table,job_table
	  FROM emp WHERE deptno=dno;
	EXCEPTION
	  WHEN NO_DATA_FOUND THEN
	    RAISE_APPLICATION_ERROR(-20010,'该部门不存在');
	END;
	/
	DECLARE
	  ename_table ename_table_type;
	  job_table job_table_type;
	BEGIN
	  get_emp(&dno,ename_table,job_table);
	  FOR i IN 1..ename_table.COUNT LOOP
	    dbms_output.put_line('姓名:'||ename_table(i)
	     ||',岗位:'||job_table(i));
	  END LOOP;
	END;
	/
18-19:删除过程
	DROP PROCEDURE add_department;
18-20:显示编译错误
	SHOW ERRORS
18-21:确定过程状态
	SELECT object_name FROM user_objects WHERE status='INVALID' AND object_type='PROCEDURE';
18-22:编译过程
	ALTER PROCEDURE get_emp COMPILE;
18-23:查看过程代码
	SELECT text FROM user_source WHERE name='GET_EMP';





























分享到:
评论

相关推荐

    pl/sql学习笔记

    以下是对PL/SQL的学习笔记的详细解析: 1. **什么是PL/SQL语言** PL/SQL是Oracle数据库为数据库管理员和开发人员设计的一种编程语言。它扩展了SQL的功能,允许编写包含控制结构、变量、过程和函数的程序段,这些...

    PL/SQL学习笔记

    PL/SQL是Oracle公司开发的一种过程化SQL扩展,它是Oracle数据库的重要组成部分,用于在数据库服务器上编写存储过程、函数、触发器、包等可执行代码。PL/SQL可以处理复杂的数据操作和业务逻辑,支持编程结构如循环、...

    pl/sql数据库学习笔记

    PL/SQL数据库学习笔记 PL/SQL是一种高级的程序语言,主要用于Oracle数据库管理系统中。下面是PL/SQL数据库学习笔记的知识点总结。 一、基本原则 *瀑布模型:需求分析→设计(概要设计,详细设计:SQL语句,变量...

    PL/SQL学习教程,附笔记

    在学习PL/SQL的过程中,理解这些基本概念和结构是至关重要的。通过实践编写存储过程、函数和触发器,你可以逐渐掌握PL/SQL的强大功能,并利用它来解决实际的数据库编程问题。对于初学者来说,循序渐进、结合实例学习...

    ORACLE PL/SQL从入门到精通

    ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括触发器、过程、函数、软件包、异常处理、游标、循环、分支、变量使用、数据库安装等关键知识点。 触发器是数据库中用来保证数据...

    PL/SQL学习笔记4

    ### PL/SQL学习笔记4 —— 集合与成员函数 #### 一、PL/SQL 表(索引表) 在PL/SQL中,**索引表**(也称为**PL/SQL表**)是一种非常有用的结构,它类似于数组但具有更多的灵活性。这种表是非持久化的,即它们不会...

    我的PL/SQL学习笔记(一)

    在这个“我的PL/SQL学习笔记(一)”中,我们将探讨PL/SQL的基础知识,包括其语法结构、变量声明、流程控制以及如何与Oracle数据库中的数据进行交互。 首先,PL/SQL的基本结构分为声明部分、执行部分和异常处理部分...

    PL/SQl超级笔记

    总的来说,“PL/SQL超级笔记”应该涵盖了从基本语法到高级特性的全面教程,通过学习,新手可以逐步掌握如何使用PL/SQL进行数据库编程,从而更好地管理和操作Oracle数据库。配合"oracle_ppt"中的PPT材料,学习效果会...

    PL/SQL听课笔记

    ### PL/SQL听课笔记 #### 一、PL/SQL简介 **PL/SQL**(Procedural Language for SQL)是一种专门为Oracle数据库设计的过程化语言扩展。它是在标准SQL基础上增加了一系列高级编程特性,如变量、控制结构、函数、...

    PL/SQL学习笔记6

    在PL/SQL编程中,游标是处理查询结果集的重要工具。它们允许程序逐行处理结果,而不是一次性加载所有数据,这对于大型数据集尤其有用,因为它可以节省内存并提高性能。下面将详细解释游标的基本概念、分类以及如何在...

    PL/SQL文本文档

    PL/SQL,全称为Procedural Language/Structured Query Language,是Oracle数据库的一种扩展,它将SQL(结构化查询语言)与过程式编程语言相结合,为数据库管理提供了强大的编程能力。以下是对PL/SQL的一些核心知识点...

    oracle笔记 (PL-SQL)

    Oracle笔记(PL-SQL)是关于数据库管理和编程的一个重要主题,主要聚焦于Oracle数据库系统中的结构化查询语言(SQL)的扩展——PL/SQL。PL/SQL是一种过程化语言,结合了SQL的功能,使得开发者能够编写复杂的数据库应用...

    PL/SQL学习笔记7

    在PL/SQL编程中,存储过程和函数是关键的组件,它们允许我们将可重用的代码逻辑存储在数据库中,以便于管理和调用。本文主要探讨了存储过程、函数以及程序包的概念,特点,创建方法,执行方式,权限管理以及参数处理...

    PL/SQL存储过程笔记

    ### PL/SQL 存储过程知识点详解 #### 1. PL/SQL 存储过程概述 PL/SQL(Procedure Language for SQL)是Oracle数据库的一种专用编程语言,它结合了SQL命令与过程化脚本,从而允许混合数据库查询与程序逻辑控制结构。...

    pl/sql学习小结笔记

    PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库的一种扩展语言,用于处理数据库中的数据和实现复杂的业务逻辑。以下是对PL/SQL的基础知识进行的详细阐述: 1. **匿名块与命名块**: ...

    oracle/SQL和PL/SQL课堂笔记

    这篇课堂笔记主要涵盖了基础的SQL查询语法和部分PL/SQL概念。 首先,SQL查询的基础是从数据库中选择数据。`SELECT`语句用于指定需要选取的列,如`SELECT ename, sal, job FROM emp;`。字段顺序可以自由调整,例如`...

Global site tag (gtag.js) - Google Analytics