Oracle存储过程及块编程基础经典案例
一个Oracle存储过程入门级实例
一个Oracle存储过程入门级实例存储过程是在面试中常被问到的程序员必备技能之一。
很多朋友被问到时唯唯诺诺,吞吞吐吐,明显自信不足。
其实存储过程无外乎就是特定的功能,在特定的层次实现。
这些朋友可能会触发器,但是不怎么用存储过程而已。
久而久之,谈虎色变。
沈阳治疗白癜风为此作者写了一个Oracle存储过程的入门级例子,用实例来帮这些朋友对存储过程say "Hello,world!"。
只希望可以方便到大家。
1sql语句创建一个用户信息表user_infoCREATE TABLE user_info(id VARCHAR2(4),name VARCHAR2(15),pwd VARCHAR2(15),address VARCHAR2(30));2sql语句创建一个存储过程AddNewUserCREATE OR REPLACE PROCEDURE AddNewUser(n_id user_info.id%TYPE,n_name user_%TYPE,n_pwd user_info.pwd%TYPE,n_address user_info.address%TYPE)ASBEGIN--向表中插入数据INSERT INTO user_info(id,name,pwd,address)VALUES(n_id,n_name,n_pwd,n_address);END AddNewUser;/表有了,存储过程有了,那么什么时候调用呢,又是如何调用的呢?3存储过程的调用--下面我们利用PL/SQL匿名块调用该过程DECLARE--描述新用户的变量v_id user_info.id%TYPE:='u002';v_name user_%TYPE:='wish';v_pwd user_info.pwd%TYPE:='history';v_add user_info.address%TYPE:='shanghai';BEGIN--调用过程,添加wish用户到数据库AddNewUser(v_id,v_name,v_pwd,v_add);DBMS_OUTPUT.PUT_LINE('用户'||v_name||'已经成功插入');END;/证明存储过程编写OK我们在程序中(或者sql可以出现的任何地方),使用sql调用我们刚写好的存储过程:--利用EXEC()直接插入EXEC AddNewUser('u003','jian','jian','beijing');--或EXECUTE AddNewUser('u004','zhang','zhang','beijing');完毕。
oracle存储过程的用法实例说明
用一个简单的例子来说明的存储过程的用法:一、功能通过存储过程自动计算出每位学生的总成绩和平均成绩,同时,如果学生在课外课程中获得的评价(comment1)为A ,就在总成绩上加20分。
现假设存在两张表一张是学生成绩表(studnet) ,字段为:stdId,math,article,language,music,sport,total,average,step一张是学生课外成绩表(out_school):字段为:stdId,parctice,comment二、建表--学生成绩表CREATE TABLE STUDENT(STDID VARCHAR2(30),MATH NUMBER,ARTICLE NUMBER,LANGUAGE NUMBER,MUSIC NUMBER,SPORT NUMBER,TOTAL NUMBER,AVERAGE NUMBER,STEP CHAR(2));--学生课外成绩表CREATE TABLE OUT_SCHOOL( STDID VARCHAR2(30),COMMENT1 VARCHAR2(1),PARCTICE VARCHAR2(30));三、自定义数组类型-- 定义数组类型myArraycreate or replace package myPackage istype stdInfo is record(stdId varchar(30),comment1 varchar(1));type myArray is table of stdInfo index by binary_integer;end myPackage;四、存储过程create or replace procedure autocomputer(step in varchar)isrsCursor SYS_REFCURSOR;commentArray myPackage.myArray;math number;article number;language number;music number;sport number;total_1 number;average_1 number;stdId_1 varchar(30);record myPackage.stdInfo;t number;beginget_comment(commentArray); -- 调用名为get_comment() 的存储过程获取学生课外评分信息OPEN rsCursor for select stdId,math,article,language,music,sport from student t where t.step = step;LOOPtotal_1:=0;fetch rsCursor into stdId_1,math,article,language,music,sport;exit when rsCursor%NOTFOUND;for t in mentArray.count LOOPrecord := commentArray(t);if stdId_1 = record.stdId thenbeginif ment1='A' thenbegintotal_1:=total_1+ 20;goto continue;--或exit;end;end if;end;end if;end LOOP;<<continue>>total_1 := total_1+math + article + language + music + sport;average_1 := total_1 / 5;update student t set t.total=total_1 , t.average = average_1 where t.stdId = stdId_1;END LOOP;end;-- 取得学生评论信息的存储过程create or replace procedure get_comment(commentArray out myPackage.myArray)isrs SYS_REFCURSOR;--recommentArray myPackage.myArray;record myPackage.stdInfo;stdId_1 VARCHAR2(30);comment_1 varchar(1);i number;beginopen rs for select stdId,comment1 from out_school ;i := 1;LOOPfetch rs into stdId_1,comment_1; exit when rs%NOTFOUND;record.stdId := stdId_1;ment1:= comment_1;commentArray(i) := record;--insert into stest1--values(commentArray(i).stdId,commentArray(i).comment1) ;i:=i + 1;end LOOP;end get_comment;五。
oracle 存储过程优秀例子
oracle 存储过程优秀例子Oracle存储过程是一种在数据库中存储并可以被重复调用的程序单元。
它可以用于实现复杂的业务逻辑,提高数据库的性能和安全性。
下面列举了十个优秀的Oracle存储过程例子。
1. 用户注册存储过程该存储过程可以用于用户注册过程的验证和处理。
它可以检查用户提交的信息是否有效,并将用户信息插入到用户表中。
如果有错误或重复信息,它会返回相应的错误消息。
2. 商品库存更新存储过程该存储过程用于处理商品出库和入库的操作。
它会更新商品表中的库存数量,并记录相应的操作日志。
如果库存不足或操作失败,它会返回错误消息。
3. 订单生成存储过程该存储过程用于生成订单并更新相关表的信息。
它可以检查订单的有效性,计算订单总金额,并将订单信息插入到订单表和订单明细表中。
如果有错误或重复订单,它会返回相应的错误消息。
4. 日志记录存储过程该存储过程用于记录系统的操作日志。
它可以根据传入的参数,将操作日志插入到日志表中,并记录操作的时间、操作人和操作内容。
这样可以方便后续的审计和故障排查。
5. 数据备份存储过程该存储过程用于定期备份数据库中的重要数据。
它可以根据预设的时间间隔,将指定表的数据导出到备份表中,并记录备份的时间和备份人。
这样可以保证数据的安全性和可恢复性。
6. 数据清理存储过程该存储过程用于定期清理数据库中的过期数据。
它可以根据预设的条件,删除指定表中的过期数据,并记录清理的时间和清理人。
这样可以减少数据库的存储空间和提高查询性能。
7. 权限管理存储过程该存储过程用于管理数据库中的用户权限。
它可以根据传入的参数,为指定用户或角色分配或撤销相应的权限。
同时,它可以记录权限的变更历史,以便审计和权限回溯。
8. 数据统计存储过程该存储过程用于统计数据库中的数据。
它可以根据预设的条件,查询指定表中的数据,并根据统计规则生成相应的统计报表。
这样可以方便用户对数据进行分析和决策。
9. 数据导入存储过程该存储过程用于将外部数据导入到数据库中。
oracle存储过程实例详解
oracle存储过程实例详解Oracle 存储过程实例详解:1. 什么是存储过程?Oracle 存储过程是一种类似于子程序或函数的数据库对象,在数据库中完成特定任务,其能大大加快数据库操作的响应时间。
Oracle存储过程功能表现为一个静态数据库对象,它可以接受参数,在每次执行制定的任务时还可以返回结果。
它也可以根据参数进行多次执行,以便对数据进行多次处理。
2. Oracle 存储过程的使用步骤(1)创建存储过程:使用CREATE PROCEDURE 语句创建存储过程,指定参数,SQL语句或控制结构;(2)调用存储过程:通过使用 CALL 语句调用该存储过程。
(3)定义变量:为Oracle 存储过程定义变量;(4)使用 OUT 参数:处理 OUT 参数,其所提供的数据将被程序处理;(5)处理返回值:在Oracle存储过程中返回值可以被处理;(6)删除存储过程:使用DROPPROCEDURE 语句删除存储过程;3. Oracle 存储过程的优点(1)提高运行性能:Oracle 存储过程能够提高数据库查询性能,并利用该存储过程重复运行减少数据库操作;(2)高安全性:由于Oracle存储过程运行在数据库中,因此可以很好地保证安全性;(3)实现更高级的功能:Oracle存储过程支持流程控制语句、变量以及丰富的函数。
4. Oracle 存储过程的实例以下是一个 Oracle 存储过程示例:CREATE OR REPLACE PROCEDURE employees_by_department(p_department_id IN employees.department_id%TYPE)ISBEGINSELECT last_name, salaryINTO l_last_name, l_salaryFROM employeesWHERE department_id = p_department_id;DBMS_OUTPUT.PUT_LINE('Last name: ' || l_last_name);DBMS_OUTPUT.PUT_LINE('Salary: ' || l_salary);END;这个 Oracle 存储过程 employees_by_department,用于根据部门 ID 查询某部门员工的最后一个名字和工资,最后将结果输出到DBMS_OUTPUT 对象中。
oracle 存储过程优秀例子
oracle 存储过程优秀例子Oracle存储过程是一种在数据库中存储和执行SQL语句的过程。
它可以接受参数并返回结果,用于实现复杂的业务逻辑和数据操作。
下面是10个优秀的Oracle存储过程示例,展示了不同方面的功能和用法。
1. 创建表并插入数据```sqlCREATE PROCEDURE create_employee_table ASBEGINEXECUTE IMMEDIATE 'CREATE TABLE employee (id NUMBER, name VARCHAR2(100))';EXECUTE IMMEDIATE 'INSERT INTO employee VALUES (1, ''John Doe'')';EXECUTE IMMEDIATE 'INSERT INTO employee VALUES (2, ''Jane Smith'')';END;```这个存储过程创建了一个名为employee的表,并插入了两条数据。
2. 更新员工姓名```sqlCREATE PROCEDURE update_employee_name(p_id NUMBER,p_name VARCHAR2) ASBEGINUPDATE employee SET name = p_name WHERE id = p_id;COMMIT;END;```这个存储过程接受员工的ID和新的姓名作为参数,然后更新对应员工的姓名。
3. 删除员工记录```sqlCREATE PROCEDURE delete_employee(p_id NUMBER) AS BEGINDELETE FROM employee WHERE id = p_id;COMMIT;END;```这个存储过程接受员工的ID作为参数,然后删除对应的员工记录。
oracle存储过程例子
oracle存储过程学习过程基础篇一直没有使用过存储过程今天特意学习一下oracle的存储过程一步一步学习,今天学习如下:建立一个最简单的存储过程create or replace procedure test_xg_p1 isbegindbms_output.put_line('hello world! this is the first procedure');end;建立一个带输入输出参数的存储过程:把输入的数据传给输出参数create or replace procedure test_xg_p2(a in number,x out number) isbeginx:=a;end test_xg_p2;建立一个逻辑判断的存储过程,并包含输入输出参数:近似分数的登记判断create or replace procedure test_xg_p3(a in number,x out varchar2) isbeginif a>=90 thenbeginx := 'A';end;end if;if a<90 thenbeginx:='B';end;end if;if a<80 thenbeginx:='C';end;end if;if a<70 thenbeginx:='D';end;end if;if a<60 thenbeginx:='E';end;end if;end test_xg_p3;建立一个带循环逻辑的存储过程:近似累加函数create or replace procedure test_xg_p4(a in number,x out varchar2) is tempresult number(16);begintempresult :=0;for tempa in 0..a loopbegintempresult := tempresult + tempa;end;end loop;x:=tempresult;end test_xg_p4;建立一个能从数据库中特定表中返回数据的存储过程:create or replace procedure test_xg_p5(x out varchar2) istempresult varchar2(1024);begintempresult := 'start->';select hotelid||hotelname into tempresult from hotel where hotelid =10041764; x:=tempresult;end test_xg_p5;建立一个能使用游标的带循环的存储过程:create or replace procedure test_xg_p6(x out varchar2) istempresult varchar2(10240);cursor cursor1 is select * from hotel where hotelname like '浙江%';begintempresult := 'start->';for cursor_result in cursor1 loopbegintempresult :=tempresult||cursor_result.hotelid||cursor_result.hotelname; end;end loop;x:=tempresult;end test_xg_p6;。
oracle存储过程案例及详解
存储过程经典案例及详解收藏以下案例都是在pl/sql环境运行无误的情况下,由本人整理收集的,大家可以放心浏览,案例中的分析有不妥之处望大家指正。
案例1:用fetch游标取值。
declaretype c is ref cursor;emp_sor c;cname emp.ename%type;csal emp.sal%type;beginopen emp_sor for select ename,sal from emp where deptno=10;loopfetch emp_sor into cname,csal; --取游标的值给变量。
dbms_output.put_line('ename:'||cname||'sal'||csal);exit when emp_sor%notfound;end loop;close emp_sor;end;打开emp_sor游标之后,emp_sor指针从表的第一行开始往下移动,在指定位置取值,并把该行的值赋给对应的变量。
循环取值,每一次对应行的值赋给对应的变量。
Fetch…. into 每次提取一行。
案例2:用fetch游标取值,并循环打印出部门编号为10的员工的名字和薪水。
declarecursor emp_sor is select ename,sal from emp where deptno=10;cname emp.ename%type;csal emp.sal%type;beginopen emp_sor ;loopfetch emp_sor into cname,csal; --取游标的值给变量。
dbms_output.put_line('ename:'||cname||'sal'||csal);exit when emp_sor%notfound;end loop;close emp_sor;end;案例3:运用记录变量接收游标指定的表数据。
oracle存储过程和函数例子
oracle存储过程和函数例⼦关于游标if,for的例⼦create or replace procedure peace_ifiscursor var_c is select*from grade;beginfor temp in var_c loopif temp.course_name ='OS'thendbms_output.put_line('Stu_name = '||temp.stu_name);elsif temp.course_name ='DB'thendbms_output.put_line('DB');elsedbms_output.put_line('feng la feng la ');end if;end loop;end;---关于游标 for,case 的例⼦1create or replace procedure peace_case1iscursor var_c is select*from test_case;beginfor temp in var_c loopcase temp.volwhen1thendbms_output.put_line('haha1');when2thendbms_output.put_line('haha2');when3thendbms_output.put_line('haha3');when4thendbms_output.put_line('haha4');elsedbms_output.put_line('qita');end case ;end loop;end;---关于游标 for,case 的例⼦2create or replace procedure peace_case2iscursor var_c is select*from test_case;beginfor temp in var_c loopcasewhen temp.vol=1thendbms_output.put_line('haha1');when temp.vol=2thendbms_output.put_line('haha2');when temp.vol=3thendbms_output.put_line('haha3');when temp.vol=4thendbms_output.put_line('haha4');elsedbms_output.put_line('qita');end case ;end loop;end;---关于for 循环的例⼦create or replace procedure peace_forissum1 number :=0;temp varchar2(500);beginfor i in1..9 looptemp :='';for j in1 .. iloopsum1 := i * j;temp :=temp||to_char(i) ||' * '||to_char(j) ||' = '||to_char(sum1) ||'';end loop;dbms_output.put_line(temp );end loop;end;---关于 loop循环的例⼦create or replace procedure peace_loopissum1 number :=0;temp number :=0 ;beginloopexit when temp>=10 ;sum1 := sum1+temp;temp :=temp+1;end loop;dbms_output.put_line(sum1 );end;---关于游标和loop循环的例⼦create or replace procedure loop_curisstu_name varchar2(100);course_name varchar2(100);cursor var_cur is select*from grade ;beginopen var_cur;loopfetch var_cur into stu_name,course_name;exit when var_cur%notfound;dbms_output.put_line(stu_name|| course_name);end loop;close var_cur;end;---关于异常处理的例⼦create or replace procedure peace_exp(in1 in varchar2)isc_n varchar2(100);beginselect course_name into c_n from grade where stu_name = in1; dbms_output.put_line(c_n);exceptionwhen no_data_foundthendbms_output.put_line('try');when TOO_MANY_ROWSthendbms_output.put_line('more');end;---关于异常处理的例⼦2create or replace procedure peace_insert ( c_n in varchar2)iserror EXCEPTION;beginif c_n ='OK'theninsert into course (course_name) values (c_n);elsif c_n ='NG'theninsert into course (course_name) values (c_n);raise error;elseDbms_Output.put_line('c_n'|| c_n);end if;commit;exceptionwhen error thenrollback;Dbms_Output.put_line('ERRO');end;---关于包的例⼦定义包create or replace package peace_pkgasfunction test1(in1 in varchar2)return number;procedure test2 (in2 in varchar2);end peace_pkg;---关于包的例⼦定义包体create or replace package body peace_pkgasfunction test1(in1 in varchar2)return numberastemp number;begintemp :=0;return temp;end;procedure test2 (in2 in varchar2)isbegindbms_output.put_line(in2);end;end peace_pkg;。
oracle存储过程例子
oracle存储过程例子Oracle是一种功能强大的关系型数据库管理系统,它提供了存储过程的功能,允许用户在数据库端创建和执行代码块。
存储过程是一系列SQL语句和流程控制语句的集合,它们被组织在一个可重复使用的单元中。
下面是一个示例,展示了Oracle存储过程的用法和语法。
```CREATE OR REPLACE PROCEDURE get_employee_details(p_employee_id IN NUMBER, p_department_id OUT NUMBER, p_salary OUT NUMBER)ISBEGINSELECT department_id, salaryINTO p_department_id, p_salaryFROM employeesWHERE employee_id = p_employee_id;IF p_department_id IS NULL THEN--处理找不到员工的情况DBMS_OUTPUT.PUT_LINE('Employee not found');ELSEDBMS_OUTPUT.PUT_LINE('DepartmentID: ' , p_department_id);DBMS_OUTPUT.PUT_LINE('Salary: ' , p_salary);ENDIF;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('Employee not found');WHENOTHERSTHEN--处理其他异常DBMS_OUTPUT.PUT_LINE('Error occurred');END;```以上是一个名为`get_employee_details`的存储过程,它接受员工ID作为输入,并返回他们的部门ID和薪水。
oracle存储过程实例
oracle存储过程实例存储过程是一组预先编译好的SQL语句集合,存储在数据库中,供用户在需要时调用。
Oracle数据库支持存储过程,可以在数据库中定义、存储和执行。
下面是一个使用Oracle存储过程的实例:创建一个存储过程,用于计算员工的平均工资:```CREATE OR REPLACE PROCEDURE calculate_avg_salaryASavg_salary NUMBER;BEGINSELECT AVG(salary) INTO avg_salary FROM employees;DBMS_OUTPUT.PUT_LINE('平均工资为: ' , avg_salary);END;```在此存储过程中,首先创建一个名为calculate_avg_salary的存储过程。
然后在存储过程体中定义了一个变量avg_salary,用于存储计算得到的平均工资。
接下来使用SELECT语句从employees表中计算平均工资,并将结果存储到avg_salary变量中。
最后,使用DBMS_OUTPUT.PUT_LINE函数在屏幕上打印出计算得到的平均工资。
执行存储过程:```SETSERVEROUTPUTON;EXECUTE calculate_avg_salary;```在执行存储过程之前,首先使用SET SERVEROUTPUT ON语句打开服务器输出。
然后使用EXECUTE语句调用存储过程calculate_avg_salary。
存储过程计算得到的平均工资将通过DBMS_OUTPUT.PUT_LINE函数打印在屏幕上。
除了上述示例,还可以在存储过程中实现更复杂的逻辑和操作,比如插入、更新和删除数据,处理异常等。
存储过程能够提供更高的灵活性和性能,能够减少网络通信开销,并提供更好的安全性。
在使用Oracle存储过程时,需要注意以下几点:1. 存储过程必须先编译才能执行。
编译存储过程时,Oracle会检查语法错误和依赖关系。
oracle复杂的存储过程代码实例
oracle复杂的存储过程代码实例
Oracle 数据库的存储过程是一种在数据库中存储复杂程序,这个程序可以被调用执行。
下面是一个 Oracle 存储过程的简单示例,这个存储过程将根据提供的参数更新一个表中的数据:
```sql
CREATE OR REPLACE PROCEDURE update_employee_salary(
p_emp_id IN NUMBER,
p_salary IN NUMBER
) AS
BEGIN
UPDATE employees
SET salary = p_salary
WHERE employee_id = p_emp_id;
COMMIT;
END;
/
```
在这个例子中,我们创建了一个名为 `update_employee_salary` 的存储过程,它接受两个参数:`p_emp_id` 和 `p_salary`。
这个存储过程会更新
`employees` 表中对应 `employee_id` 的员工的工资。
要调用这个存储过程,你可以使用以下 SQL 语句:
```sql
BEGIN
update_employee_salary(1, 5000);
END;
/
```
这个例子是非常基础的,实际使用中的存储过程可能会涉及到更复杂的 SQL 查询和逻辑处理。
在实际使用中,需要根据具体的业务需求来设计和编写存储过程。
oracle存储过程语句例子2---基础
declare
xname product.pname%type;
begin
getpname(1005, xname);
dbms_output.put_line('所查商品编号对应的商品名称为:' || xname);
end;
--4.in/out模式的参数
--创建子过程(求平方) 下面例子说明一个参数可以即能做输入又能做输出(但不常用)
--单词:
--1.procedure[英][prəˈsi:dʒə(r)][美][prəˈsidʒɚ]n.程序,手续; 工序,过程,步骤;
--诉讼程序,(议会的)议事程序; 〈罕〉进行;
--2.execute [英]'eksɪkju:t [美]ˈɛksɪˌkjut .vt. 执行;处死,处决;履行;完成
as --否则把那一列所有的字段值都改成了'丁家宜洗面奶',但是为什么呢??
begin
update product set pname='丁家宜洗面奶' where pid=ppid;
end;
--调用上述带参数的存储过程
--1.
plete [英]kəm'pli:t [美]kəmˈplit .adj. (用以强调)完全的;完成的;达到结尾的;完整的
--vt. 完成,使完满;完成或结束;填写(表格)
--4.function
--5.package
--6.package body
end;
begin
selectpname(1003);
end;
--3.带输出参数的存储过程 (in输入参数,ou输出参数 参数多了用"," 隔开)
oracle存储过程实例
oracle存储过程实例Oracle存储过程是一组预编译的SQL语句,可以在数据库中进行重复性的操作。
它们可以接受输入参数,并返回输出参数,可以帮助提高数据库性能,简化复杂的操作,并且可以在应用程序中进行复用。
下面是一个Oracle存储过程的示例,用于计算一个员工的平均工资:```sqlCREATE OR REPLACE PROCEDURE calculate_avg_salaryp_employee_id IN NUMBER,p_avg_salary OUT NUMBERISv_total_salary NUMBER;v_num_employees NUMBER;BEGINSELECT SUM(salary), COUNT(*) INTO v_total_salary,v_num_employeesFROM employeesWHERE department_id = p_employee_id;IF v_num_employees > 0 THENp_avg_salary := v_total_salary / v_num_employees;ELSEp_avg_salary := 0;ENDIF;END;```在上面的示例中,存储过程接受一个输入参数p_employee_id,表示部门ID,同时定义了一个输出参数p_avg_salary,用于返回平均工资。
存储过程内部使用SELECT语句查询指定部门的员工工资总和和员工数量,并将结果存储在变量v_total_salary和v_num_employees中。
然后,根据员工数量的值,计算平均工资并将结果存储在输出参数p_avg_salary 中。
存储过程可以使用CREATEORREPLACEPROCEDURE语句创建,其中的IN和OUT关键字用于指定参数的传递方式。
在存储过程内部可以使用各种SQL语句、控制结构和变量来实现业务逻辑。
存储过程可以通过调用EXECUTE或CALL语句来执行,也可以在应用程序中通过存储过程的名称来调用。
oracle存储过程学习经典[语法+实例+调用]_
Oracl e 存储过程学习目录Oracle 存储过程 (1)Oracle存储过程基础知识 (1)Oracle存储过程的基本语法 (2)关于Oracle存储过程的若干问题备忘 (4)1. 在Oracle中,数据表别名不能加as。
(4)2. 在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。
(5)3. 在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"nodata found"异常。
(5)4. 在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错 (5)5. 在存储过程中,关于出现null的问题 (5)6. Hibernate调用Oracle存储过程 (6)用Java调用Oracle存储过程总结 (6)一、无返回值的存储过程 (6)二、有返回值的存储过程(非列表) (8)三、返回列表 (9)在存储过程中做简单动态查询 (11)一、本地动态SQL (12)二、使用DBMS_SQL包 (13)Oracle存储过程调用Java方法 (16)Oracle高效分页存储过程实例 (17)Oracle存储过程基础知识商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。
存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。
这样的结果就是,代码存储一次但是能够被多个程序使用。
要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。
如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。
执行procedure 的时候,可能需要excute权限。
或者EXCUTE ANY PROCEDURE 权限。
【优质】oracle存储过程范例-范文word版 (20页)
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==oracle存储过程范例篇一:oracle存储过程案例及详解存储过程经典案例及详解收藏以下案例都是在pl/sql环境运行无误的情况下,由本人整理收集的,大家可以放心浏览,案例中的分析有不妥之处望大家指正。
案例1:用fetch游标取值。
declaretype c is ref cursor;emp_sor c;cname emp.ename%type;csal emp.sal%type;beginopen emp_sor for select ename,sal from emp where deptno=10;loopfetch emp_sor into cname,csal; --取游标的值给变量。
dbms_output.put_line('ename:'||cname||'sal'||csal);exit when emp_sor%notfound;end loop;close emp_sor;end;打开emp_sor游标之后,emp_sor指针从表的第一行开始往下移动,在指定位置取值,并把该行的值赋给对应的变量。
循环取值,每一次对应行的值赋给对应的变量。
Fetch…. into每次提取一行。
案例2:用fetch游标取值,并循环打印出部门编号为10的员工的名字和薪水。
declarecursor emp_sor is select ename,sal from emp where deptno=10;cname emp.ename%type;csal emp.sal%type;beginopen emp_sor ;loopfetch emp_sor into cname,csal; --取游标的值给变量。
dbms_output.put_line('ename:'||cname||'sal'||csal);exit when emp_sor%notfound;end loop;close emp_sor;end;案例3:运用记录变量接收游标指定的表数据。
Oracle数据库中存储过程的学习实例
测试用表student:1.实例1:Oracle存储过程返回结果集--声明一个packagecreate or replace package package_pro_test astype cursor_rs is ref cursor;Procedure proc_test(p_rs out cursor_rs);end package_pro_test;--实现package体,创建存储过程-- IN 和OUT 参数--java将IN 参数传给 CallableStatement 对象是通过 setXXX 方法完成--的。
该方法继承自--PreparedStatement。
所传入参数的类型决定了所用的setXXX 方法--(例如,用 setFloat 来传入float 值等)。
CREATE OR REPLACE Package Body PACKAGE_PRO_TEST IsProcedure proc_test(p_rs out cursor_rs)isbeginopen p_rs for'select * from student';end proc_test;end PACKAGE_PRO_TEST;//java中调用存储过程import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import oracle.jdbc.OracleResultSet;/**** 调用存储过程获取查询结果集* @author gwy**/public class Test1 {public static void main(String[] args) {Connection conn = null;Statement stmt = null;ResultSet rs = null;try {Class.forName("oracle.jdbc.driver.OracleDriver");conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");System.out.println("连接成功!");//核心代码:/*** 通过call调用PACKAGE_PRO_TEST.proc_test存储过程。
存储过程实例oracle
一:之五兆芳芳创作CREATE OR WordStr PROCEDURE proc_batchISinteractionhour varchar(100);upcdrname varchar(100);part_hour varchar(100);calendar date;interactionday1 varchar(100);interactionday varchar(100);part_day varchar(100);errmsg varchar(300);BEGINcalendar := sysdate-1/24;part_hour :=to_char(sysdate-1/24,'hh24');part_day :=to_char(sysdate-1,'dd');interactionhour := 'interactionhour'||to_char(calendar,'yyyymm'); interactionday := 'interactionday'||to_char(calendar,'yyyymm'); interactionday1 := 'interactionday1'||to_char(calendar,'yyyymm'); upcdrname := 'upcdr'||to_char(calendar,'yymmdd');proc_interactionhour (interactionhour,upcdrname ,part_hour ,calendar);if to_char(sysdate,'hh24')='03' thenproc_interactionday(interactionhour ,interactionday ,interactionday1 ,part_day );end if;if to_char(sysdate,'hh24')='04' thenproc_interactiondayshow (interactionday1 ,interactionday );end if;insert into appmsgvalues('成功执行proc_batch','proc_batch',sysdate);commit;EXCEPTIONWHEN OTHERS THENrollback;errmsg:= substr(sqlerrm,1,300);insert into appmsgvalues ('没有成功执行proc_batch','proc_batch',sysdate);commit;END proc_batch;/二:CREATE OR WordStr PROCEDURE proc_interactionday (interactionhour varchar,interactionday varchar,interactionday1 varchar,part_day varchar)ISsqltxt1 varchar(2000);sqltxt2 varchar(2000);cur_no number;cur_val number;errmsg varchar(300);BEGINsqltxt1 :=' insert into '|| interactionday||' (rival_no,area_no,calendar) '||' select distinct rival_no,area_no,substr(calendar,1,8) '||' calendar from '|| interactionhour||' partition (part_'|| part_day||' ) '||' where 1=1 '||' and substr(rival_no,1,2)=''04'' ';cur_no:=dbms_sql.open_cursor;dbms_sql.parse(cur_no,sqltxt1,dbms_sql.native);cur_val:=dbms_sql.execute(cur_no);dbms_sql.close_cursor(cur_no);sqltxt2 :=' insert into '|| interactionday1||' (rival_no,area_no,calendar) '||' select distinct rival_no,area_no,substr(calendar,1,8) '||' calendar from '|| interactionhour||' partition (part_'|| part_day||' ) '||' where 1=1 '||' and substr(rival_no,1,3) in(''130'',''131'',''132'',''133'',''134'' ) ';cur_no:=dbms_sql.open_cursor;dbms_sql.parse(cur_no,sqltxt2,dbms_sql.native);cur_val:=dbms_sql.execute(cur_no);dbms_sql.close_cursor(cur_no);insert into appmsgvalues('成功执行proc_interactionday','proc_interactionday',sysdate); commit;EXCEPTIONWHEN OTHERS THENrollback;errmsg := substr(sqlerrm,1,300);insert into appmsgvalues('没有成功执行proc_interactionday,原因是:'||errmsg,'proc_interactionday',sysdate) ;commit;END proc_interactionday;/三:CREATE OR WordStr PROCEDURE proc_interactiondayshow (interactionday1 varchar,interactionday varchar)ISsqltxt1 varchar(2000);sqltxt2 varchar(2000);sqltxt3 varchar(2000);sqltxt4 varchar(2000);cur_no number;cur_val number;errmsg varchar(300);BEGINsqltxt1 :=' insert into '||'interactioncodedayshow(supplier,code,tos,area_name,part_name,total,ca lendar) '||' select b.supplier,b.code,b.tos,b.area_name,b.part_name,count(*) total,a.calendar '||' from '|| interactionday1||' a, '||'static_interactionno1 b '||' where 1=1 '||' and to_number(substr(a.rival_no,1,7))=b.code '||' group byb.code,b.supplier,b.tos,b.area_name,b.part_name,a.calendar ';cur_no:=dbms_sql.open_cursor;dbms_sql.parse(cur_no,sqltxt1,dbms_sql.native);cur_val:=dbms_sql.execute(cur_no);dbms_sql.close_cursor(cur_no);sqltxt2 :=' insert into '||'interactioncodedayshow(supplier,area_name,part_name,tos,cod e,total,calendar)'||' selectc.supplier,c.area_name,c.part_name,c.tos,c.code,d.total,d.calendar '||' from static_interactionno c, '||' (select substr(rival_no,1,6) code,count(*) total,calendar '||' from '|| interactionday||' group by substr(rival_no,1,6),calendar '||' union all '||' select substr(rival_no,1,7) code,count(*) total,calendar '||' from '|| interactionday||' group by substr(rival_no,1,7),calendar '||' union all '||' select substr(rival_no,1,8) code,count(*) total,calendar '||' from '|| interactionday||' group by substr(rival_no,1,8),calendar) d '||' where c.area_no||c.code=d.code '||' order by c.area_no ';cur_no:=dbms_sql.open_cursor;dbms_sql.parse(cur_no,sqltxt2,dbms_sql.native);cur_val:=dbms_sql.execute(cur_no);dbms_sql.close_cursor(cur_no);sqltxt3 :='insert into'||' interactionpartdayshow(supplier,area_name,part_name,tos, total,calendar )'||' select supplier,area_name,part_name,tos,sum(total) total,calendar '||'from'||' interactioncodedayshow '||' group by part_name,supplier,tos,calendar,area_name ';cur_no:=dbms_sql.open_cursor;dbms_sql.parse(cur_no,sqltxt3,dbms_sql.native);cur_val:=dbms_sql.execute(cur_no);dbms_sql.close_cursor(cur_no);sqltxt4 :=' insert into'||' interactionareadayshow (supplier,area_name,tos, total,calendar) '||' select supplier,area_name,tos,sum(total) total,calendar '||' from interactioncodedayshow '||' group by supplier,tos,calendar,area_name ';cur_no:=dbms_sql.open_cursor;dbms_sql.parse(cur_no,sqltxt4,dbms_sql.native);cur_val:=dbms_sql.execute(cur_no);dbms_sql.close_cursor(cur_no);insert into appmsgvalues('成功执行proc_interactiondayshow','proc_interactiondayshow',sysdate);commit;EXCEPTIONWHEN OTHERS THENrollback;errmsg := substr(sqlerrm,1,300);insert into appmsgvalues('没有成功执行proc_interactionday,原因是:'||errmsg,'proc_interactionday',sysdate) ;commit;END proc_interactiondayshow;/四:CREATE OR WordStr PROCEDURE proc_interactionhour (interactionhour varchar,upcdrname varchar,part_hour varchar,calendar date)ISsqltxt varchar(20000);cur_no number;cur_val number;errmsg varchar(300);BEGINsqltxt :=' insert into '||interactionhour||' (rival_no,area_no,calendar) '||' with '||' ls1 as '||' (select case '||' when substr(trim(truncatedcaller),1,2)=''13'' and length(trim(truncatedcaller))=11 then trim(truncatedcaller) '||' when substr(trim(truncatedcaller),1,3)=''153'' and length(trim(truncatedcaller))=11 then trim(truncatedcaller) '||' when substr(trim(truncatedcaller),1,1) between 2 and 8 and length(trim(truncatedcaller))=7 then trim(truncatedcaller) '||' else ''110'''||' end rival_no,'||' case '||' when substr(trim(applix_no),1,2)=''13'' and length(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,3)=''153'' and length(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,1)=''0'' and length(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,2) between 2 and 8 and length(trim(applix_no))=7 then trim(applix_no) '||' else ''110'''||' end applix_no,sarea,darea,'|| to_char(calendar,'yyyymmddhh24')||' calendar from '||upcdrname||' partition (part_'||part_hour||') cdr '||' where 1=1'||' and exists (select ''x'' fromstatic_interactionname s where cdr.opc=s.xpc and netname<>''移动'')'||' and exists (select ''x'' fromstatic_interactionname s where cdr.dpc=s.xpc and netname=''移动'')'||' and cf between 132 and 139 '||' ), '||' ls2 as '||' (select case '||' when substr(trim(truncatedcalled),1,2)=''13'' and length(trim(truncatedcalled))=11 then trim(truncatedcalled) '||' when substr(trim(truncatedcalled),1,3)=''153'' and length(trim(truncatedcalled))=11 then trim(truncatedcalled) '||' when substr(trim(truncatedcalled),1,1) between 2 and 8 and length(trim(truncatedcalled))=7 then trim(truncatedcalled) '||' else ''110'''||' end rival_no,'||' case '||' when substr(trim(applix_no),1,2)=''13'' and length(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,3)=''153'' and length(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,1)=''0'' and length(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,2) between 2 and 8 and length(trim(applix_no))=7 then trim(applix_no) '||' else ''110'''||' end applix_no,sarea,darea,'|| to_char(calendar,'yyyymmddhh24')||' calendar from '||upcdrname||' partition (part_'||part_hour||' ) cdr '||' where 1=1 '||' and exists (select ''xpc'' fromstatic_interactionname s where cdr.dpc=s.xpc and netname<>''移动'') '||' and exists (select ''xpc'' fromstatic_interactionname s where cdr.opc=s.xpc and netname=''移动'')'||' and cf between 132 and 139 '||' ) '||' select rival_no,sarea,calendar '||' from ls1 '||' where sarea between 431 and 439 '||' union '||' select applix_no,darea,calendar '||' from ls1 '||' where darea between 431 and 439 '||' union '||' select rival_no,darea,calendar '||' from ls2 '||' where darea between 431 and 439 '||' union '||' select applix_no,darea,calendar '||' from ls2 '||' where darea between 431 and 439 '; cur_no:=dbms_sql.open_cursor;dbms_sql.parse(cur_no,sqltxt,dbms_sql.native);cur_val:=dbms_sql.execute(cur_no);dbms_sql.close_cursor(cur_no);commit;insert into appmsgvalues('成功执行proc_interactionhour','proc_interactionhour',sysdate);commit;EXCEPTIONWHEN OTHERS THENrollback;errmsg := substr(sqlerrm,1,300);insert into appmsgvalues('没有成功执行proc_interactionhour,原因是:'||errmsg,'proc_interactionhour',sysdate) ;commit;END proc_interactionhour;/五:CREATE OR WordStr PROCEDURE proc_interactionhouryzg (interactionhour varchar,upcdrname varchar,part_hour varchar,calendar date)ISsqltxt varchar(20000);cur_no number;cur_val number;errmsg varchar(300);BEGINsqltxt :=' insert into '||interactionhour||' (rival_no,area_no,calendar) '||' with '||' ls1 as '||' (select case '||' when substr(trim(truncatedcaller),1,2)=''13'' and length(trim(truncatedcaller))=11 then trim(truncatedcaller) '||' when substr(trim(truncatedcaller),1,3)=''153'' and length(trim(truncatedcaller))=11 then trim(truncatedcaller) '||' when substr(trim(truncatedcaller),1,1) between 2 and 8 and length(trim(truncatedcaller))=7 then''0''||sarea||trim(truncatedcaller) '||' else ''110'''||' end rival_no,'||' case '||' when substr(trim(applix_no),1,2)=''13'' and length(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,3)=''153'' and length(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,1)=''0'' and length(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,2) between 2 and 8 and length(trim(applix_no))=7 then ''0''||darea||trim(applix_no) '||' else ''110'''||' end applix_no,sarea,darea,'|| to_char(calendar,'yyyymmddhh24')||' calendar from '||upcdrname||' partition (part_'||part_hour||') cdr '||' where 1=1'||' and exists (select ''x'' fromstatic_interactionname s where cdr.opc=s.xpc and netname<>''移动'')'||' and exists (select ''x'' fromstatic_interactionname s where cdr.dpc=s.xpc and netname=''移动'')'||' and cf between 132 and 139 '||' ), '||' ls2 as '||' (select case '||' when substr(trim(truncatedcalled),1,2)=''13'' and length(trim(truncatedcalled))=11 then trim(truncatedcalled) '||' when substr(trim(truncatedcalled),1,3)=''153'' and length(trim(truncatedcalled))=11 then trim(truncatedcalled) '||' when substr(trim(truncatedcalled),1,1) between 2 and 8 and length(trim(truncatedcalled))=7 then''0''||darea||trim(truncatedcalled) '||' else ''110'''||' end rival_no,'||' case '||' when substr(trim(applix_no),1,2)=''13'' and length(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,3)=''153'' and length(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,1)=''0'' and length(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,2) between 2 and 8 and length(trim(applix_no))=7 then ''0''||darea||trim(applix_no) '||' else ''110'''||' end applix_no,sarea,darea,'|| to_char(calendar,'yyyymmddhh24')||' calendar from '||upcdrname||' partition (part_'||part_hour||' ) cdr '||' where 1=1 '||' and exists (select ''xpc'' fromstatic_interactionname s where cdr.dpc=s.xpc and netname<>''移动'') '||' and exists (select ''xpc'' fromstatic_interactionname s where cdr.opc=s.xpc and netname=''移动'')'||' and cf between 132 and 139 '||' ) '||' select rival_no,sarea,calendar '||' from ls1 '||' where sarea between 431 and 439 '||' union '||' select applix_no,darea,calendar '||' from ls1 '||' where darea between 431 and 439 '||' union '||' select rival_no,darea,calendar '||' from ls2 '||' where darea between 431 and 439 '||' union '||' select applix_no,darea,calendar '||' from ls2 '||' where darea between 431 and 439 '; cur_no:=dbms_sql.open_cursor;dbms_sql.parse(cur_no,sqltxt,dbms_sql.native);cur_val:=dbms_sql.execute(cur_no);dbms_sql.close_cursor(cur_no);commit;insert into appmsgvalues('成功执行proc_interactionhour','proc_interactionhour',sysdate);commit;EXCEPTIONWHEN OTHERS THENrollback;errmsg := substr(sqlerrm,1,300);insert into appmsgvalues('没有成功执行proc_interactionhour,原因是:'||errmsg,'proc_interactionhour',sysdate) ;commit;END proc_interactionhouryzg;/六:CREATE OR WordStr PROCEDURE proc_text(interactionhour varchar,upcdrname varchar,part_hour varchar,calendar date)ISsqltxt varchar(2000);cur_no number;cur_val number;errmsg varchar(300);BEGINsqltxt :=' insert into '|| interactionhour||' (rival_no,area_no,calendar) '||' with '||' ls1 as '||' ('||' select '||' case '||' when substr(trim(truncatedcaller),1,2)=''13'' and length(trim(truncatedcaller))=11 then trim(truncatedcaller) '||' when substr(trim(truncatedcaller),1,3)=''153'' andlength(trim(truncatedcaller))=11 then trim(truncatedcaller) '||' when substr(trim(truncatedcaller),1,1) between 2 and 8 and length(trim(truncatedcaller))=7 then trim(truncatedcaller) '||' else ''8688888'' '||' end rival_no, '||' case '||' when substr(trim(applix_no),1,2)=''13'' andlength(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,3)=''153'' andlength(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,2) between 2 and 8 and length(trim(applix_no))=7 then trim(applix_no) '||' when substr(trim(applix_no),1,1)=''0'' andlength(trim(applix_no))=11 then trim(applix_no) '||' else ''8688888'' '||' end applix_no,sarea,darea,''20060902'' '|| to_char(calendar,'yyyymmddhh24')||' calendar from '|| upcdrname||' partition (part_ '|| part_hour||' ) '||' cdr '||' where 1=1 '||' and exists (select ''x'' from static_interactionname e where cdr.opc=e.xpc and netname<>''移动'') '||' and exists (select ''x'' from static_interactionname e where cdr.dpc=e.xpc and netname=''移动'') '||' and cf between 132 and 139), '||' ls2 as '||' (select case '||' when substr(trim(truncatedcalled),1,2)=''13'' andlength(trim(truncatedcalled))=11 then trim(truncatedcalled) '||' when substr(trim(truncatedcalled),1,3)=''153'' andlength(trim(truncatedcalled))=11 then trim(truncatedcalled) '||' when substr(trim(truncatedcalled),1,1) between 2 and 8 and length(trim(truncatedcalled))=7 then trim(truncatedcalled) '||' else ''8688888'' '||' end rival_no, '||' case '||' when substr(trim(applix_no),1,2)=''13'' andlength(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,3)=''153'' andlength(trim(applix_no))=11 then trim(applix_no) '||' when substr(trim(applix_no),1,2) between 2 and 8 and length(trim(applix_no))=7 then trim(applix_no) '||' when substr(trim(applix_no),1,1)=''0'' andlength(trim(applix_no))=11 then trim(applix_no) '||' else ''8688888'' '||' end applix_no,darea,''20060902'' '|| to_char(calendar,'yyyymmddhh24')||' calendar from '|| upcdrname||' partition (part_ '|| part_hour||' ) '||' cdr '||' where 1=1 '||' and exists (select ''xpc'' from static_interactionname e where cdr.opc=e.xpc and netname=''移动'') '||' and exists (select ''xpc'' from static_interactionname e where cdr.dpc=e.xpc and netname<>''移动'') '||' and cf between 132 and 139) '||' select rival_no,sarea,calendar '||' from ls1 '||' where 1=1 '||' and sarea between 431 and 439 '||' union '||' select applix_no,darea,calendar '||' from ls1 '||' where 1=1 '||' and darea between 431 and 439 '||' union '||' select rival_no,darea,calendar '||' from ls2 '||' where 1=1 '||' and darea between 431 and 439 '||' union '||' select applix_no,darea,calendar '||' from ls2 '||' where 1=1 '||' and darea between 431 and 439 ';cur_no:=dbms_sql.open_cursor;dbms_sql.parse(cur_no,sqltxt,dbms_sql.native); cur_val:=dbms_sql.execute(cur_no);dbms_sql.close_cursor(cur_no);insert into appmsgvalues('成功执行proc_test','proc_test',sysdate); commit;EXCEPTIONWHEN OTHERS THENrollback;errmsg := substr(sqlerrm,1,300);insert into appmsgvalues('没有成功执行proc_test 原因是:'||errmsg,'proc_test',sysdate) ;END proc_text;/。
oracle存储过程代码实例一
oracle存储过程代码实例一1、用来插入大量测试数据的存储过程CREATE OR REPLACE PROCEDURE INSERTAMOUNTTEST(ST_NUM IN NUMBER,ED_NUM IN NUMBER)ISBEGINdeclarei number;beginFOR i IN ST_NUM..ED_NUM LOOPINSERT INTO tb values(i,i,'3','3','3',100,'0');END LOOP;end;END;运行:sql>execute INSERTAMOUNTTEST(1,45000) -- 一次插入45000条测试数据2、从存储过程中返回值create or replace procedure spaddflowdate(varAppTypeId in varchar2,varFlowId in varchar2,DateLength in number,ReturnValue out number --返回值)isbegininsert into td values(varAppTypeId,varFlowId,DateLength)returning 1 into ReturnValue; --返回值commit;exceptionwhen others thenrollback;end;存储过程的执行sql>variable testvalue number;sql>execute spaddflowdate('v','v',2,:testvalue);sql>print就可以看到执行结果3、用包实现存储过程返回游标:create or replace package test_pastype outList is ref cursor;PROCEDURE getinfor(taxpayerList out outList);end test_p;/create or replace package body test_p as PROCEDURE get infor(taxpayerList out outList) is beginOPEN taxpayerList FOR select * fromtd where tag='0';end getinfor;end test_p;/运行:set serverout on; --将输出工具打开variable x refcursor;execute test_p.getinfor(:x);exec test_p.getinfor(:x);print x;drop package test_p;认识存储过程和函数存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块。
Oracle存储过程案例详解
Oracle存储过程案例详解创建简单存储过程(Hello World)为了⽅便读者简单易懂,我将下⾯使⽤到的表复制给⼤家。
具体表中的数据,请⼤家⾃⼰填写-- Create tablecreate table EMP(empno NUMBER(4) not null,ename VARCHAR2(10),job VARCHAR2(9),mgr NUMBER(4),hiredate DATE,sal NUMBER(7,2),comm NUMBER(7,2),deptno NUMBER(2))create or replace procedure firstP(name in varchar2) is/*这⾥name为的参数,in为输⼊,varchar2为类型*/begin/* dbms_output.put_line(); 相当输出到控制台上,这样我们⼀个简单的存储过程就完成啦记住⼀句话的结束使⽤分号结束,存储过程写完⼀定要执⾏将它保存到数据库中 (F8)快捷键,或者点击左上⾓执⾏*/dbms_output.put_line('我的名字叫'||name);/*dbms_output.put_line相当于JAVA中的System.out.println("我的名字叫"+name);*/ end firstP;下⾯我们要对刚刚写过的存储过程进⾏测试,我们开启Test Window这个窗⼝-- Created on 2018/12/30 星期⽇ by ADMINISTRATORdeclare-- Local variables here/*测试名称名称类型使⽤ := 给参数赋值,在多说⼀句,分号结束本句*/name2 varchar2(64):='数据库';begin-- Test statements herefirstp(name2);end;我们打开DBMS Output就可以看到执⾏的存储过程啦。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle存储过程及块编程基础案例
pl/sql(procedure language/sql:过程语言)编程是oracle的精髓之所在。
跑得慢:
提高应用程序的运行性能,提高效率。
1.作为存储过程处理:模块化的设计思想(分页过程,订单的过程,转账的过程。
)
2.优化sql做的最简。
3.减少网络传输量:java(sql)--》oracle,调用的这个数据库不在同一个机器上,就需要网络传输,每个sql语句都要传到数据库所在的机器上去,所以执行效率就会变得慢下来。
案例1:
编写一个存储过程该过程可以向某张表添加记录。
1.建表:create table mytest(name varchar2(30),passwd varchar2(30));
2.建过程:
create or replace procedure sp_p1 is begin
insert into mytest values('xxx','m123');
end;
3.调用该过程:exec 过程名
注:在一局中添加replace:表示如果有sp_prol,就替换。
如何查看错误信息:show error;
调用该过程:exec 过程名;或者call 过程名。
2.编写一个存储过程该过程可以删除某表记录。
create or replace procedure sp_pro1 is begin
delete from mytest where name='xxx';
end;
这里需要引入一个快的概念,块(编程):块中可以包含过程,函数,触发器,包等。
块结构:定义部分,执行部分,例外处理部分;decrear:(可选),定义部分常量,变量,游标,例外,复杂数据类型。
begin(必选)执行部分即要执行的pl/sql 语句;exception:(可选)例外处理部分即处理运行的各种错误。
End结束;
案例2:输出hello
begin
dbms_output.put_line('hello');
end;
/
注意:折执行成功之后却没有出现hello的字样。
是因为set serveroutput on---打开输出选项,没这句话的话不会输出(set serveroutput off 关闭输出选项),所有应该在执行程序之前先执行set serveroutput on这句话。
案例3:输入雇员编号显示雇员的名字。
declare
v_ename varchar2(10);
begin
select ename into v_ename from emp where empno=&no;
dbms_output.put_line('该雇员是:'||v_ename);
end;
/
注意:一定要编写规范,一些重要的标点符号不能不写,案例2定义的的变量v_ename要与emp表中的ename的类型一致否则会报错。