律师在线解答过程

Oracle存储过程详解(引用)+补充 - gaojun - 博客园
本文本引用自: 一、过程 (存储过程)
过程是一个能执行某个特定操作的子程序。使用CREATE OR REPLACE创建或者替换保存在数据库中的一个子程序。示例1:声明存储过程,该过程返回dept表行数DECLARE
PROCEDURE getDeptCount
deptCount INT;
SELECT COUNT(*) INTO deptCount FROM DEPT;
DBMS_OUTPUT.PUT_LINE('DEPT表的共有记录数:'||deptCount);
END getDeptC
getDeptCount[()];
注意:此存储过程getDeptCount只在块运行时有效。示例2:创建不带参数的存储过程,该过程返回dept表行数CREATE OR REPLACE PROCEDURE getDeptCount
SELECT COUNT(*) INTO deptCount FROM
DBMS_OUTPUT.PUT_LINE('dept表共有'||deptCount||'行记录');
END [getDeptCount];
当我们创建的存储过程没有参数时,在存储过程名字后面不能有括号。在AS或者IS后至BEGIN之前是声明部分,存储过程中的声明不使用DECLARE关键字。同匿名PL/SQL块一样,EXCEPTION和声明部分都是可选的。当我们创建的过程带有错误时,我们可以通过SELECT * FROM USER_ERRORS查看,或者使用SHOW ERRORS [ PROCEDURE Proc_Name]查看。使用以下代码可以执行存储过程:BEGIN
以上存储过程还可以通过以下代码来简化调用:
EXEC getDeptCount[;]
getDeptCount();
并不是所有的存储过程都可以用这种方式来调用
定义无参存储过程时,存储过程名后不能加()
在块中或是通过EXEC调用存储过程时可以省略()
通过CALL调用无参存储过程必须加上()
示例3:创建带有输入参数的存储过程,该过程通过员工编号打印工资额CREATE OR REPLACE PROCEDURE getSalaryByEmpNo(eNo NUMBER)
--参数的数据类型不能指定长度
salary emp.sal%TYPE;
SELECT SAL INTO salary
FROM EMP WHERE EMPNO=eNo;
DBMS_OUTPUT.PUT_LINE(eNo||'号员工的工资为'||salary);
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有找到该编号的员工');
当定义的存储过程含有参数时,参数的数据类型不能指定长度。参数还有输入和输出之分,本例中没有指定,默认情况为输入参数,也可显示的指定某个参数是输入参数,如(eNo IN NUMBER)。同示例1不同,该例中加入了异常处理。同示例1类似可以使用下面的两种方式调用存储过程:BEGINgetSalaryByEmpNo(7788);END;或者EXEC getSalaryByEmpNo(7788);& 或者CALL getSalaryByEmpNo(7788);但是如果传给一个存储过程的参数是变量时,必须使用BEGIN& END块,如下:DECLARE
no emp.empNo%TYPE;
getSalaryByEmpNo(no);
如果某个包中含有常量,也可以通过如下的方式调用:EXEC getSalaryByEmpNo(ConstantPackage.no);但这种方式不能再使用CALL调用。示例4:创建含有输入和输出参数的存储过程,该过程通过员工编号查找工资额,工资额以输出参数返回CREATE OR REPLACE PROCEDURE getSalaryByEmpNo(eNo IN NUMBER,salary OUT NUMBER)
SELECT SAL INTO salary
FROM EMP WHERE EMPNO=eNo;
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有找到该编号的员工');
当过程中含有输出参数时,调用时必须通过BEGIN& END块,不能通过EXEC或CALL调用。如:DECLARE
salary NUMBER(7,2);
getSalaryByEmpNo(7788,salary);
DBMS_OUTPUT.PUT_LINE(salary);
示例5:创建参数类型既是输入参数也是输出参数的过程CREATE OR REPLACE PROCEDURE getSalaryByEmpNo(noSalary IN OUT NUMBER)
SELECT SAL INTO noSalary FROM EMP WHERE EMPNO=noS
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有找到该编号的员工');
调用如下:DECLARE
no NUMBER(7,2);
getSalaryByEmpNo(no);
DBMS_OUTPUT.PUT_LINE(no);
示例6:创建带有默认值的过程CREATE OR REPLACE PROCEDURE addEmp
empNo NUMBER,
eName VARCHAR2,
VARCHAR2 :='CLERK',
hiredate DATE
DEFAULT SYSDATE,
DEFAULT 1000,
DEFAULT 0,
deptNo NUMBER
DEFAULT 30
INSERT INTO emp VALUES(empNo,eName,job,mgr,hiredate,sal,comm,deptNo);
调用如下:EXEC addEmp(7776,'zhangsan','CODER',7788,'06-1月-2000',);
--没有使用默认值
EXEC addEmp(7777,'lisi','CODER',7788,'06-1月-2000',2000,NULL,10);
--可以使用NULL值
EXEC addEmp(7778,'wangwu',mgr=&7788);
--使用默认值
EXEC addEmp(mgr=&7788,empNo=&7779,eName=&'sunliu');
--更改参数顺序
示例7:使用NOCOPY编译提示当参数是大型数据结构时,如集合、记录和对象实例,把它们的内容全部拷贝给形参会降低执行速度,消耗大量内存。为了防止这样的情况发生,我们可以使用 NOCOPY提示来让编译器按引用传递方式给IN OUT模式的参数。DECLARE
TYPE DeptList IS TABLE OF VARCHAR2(10);
DeptList:=DeptList('CORESUN','CORESUN','CORESUN','CORESUN');
PROCEDURE My_Proc(d IN OUT NOCOPY DeptList)
注意:NOCOPY只是一个提示,而不是指令。即使有时候我们使用了NOCOPY,但编译器有可能仍然会进行值拷贝。通常情况下NOCOPY是可以成功的。
二、维护过程
1、删除存储过程DROP PROCEDURE Proc_N
2、查看过程状态SELECT object_name,status
FROM USER_OBJECTS WHERE object_type='PROCEDURE';
3、重新编译过程ALTER PROCEDURE Proc_Name COMPILE;
4、查看过程代码SELECT * FROM USER_SOURCE WHERE TYPE='PROCEDURE';
三、参数的理解
-- 输出参数不可以修改解决的方法有两种--1 把参数改成输入参数 --2 就是参数改成 可输入输出的参数;调用过程的 三个方式1 就是使用call在只用call方式调用函数的时候,必须加要括号,有参数,还要加参数值
这个方式在命令窗口,调用过程,将不会出现输入的数据.2 就是使用exec 命令,进行命令调用过程, 使用命令,就必须在命令行里面输入过程名,这个命令窗口中,可加可不加() ,如果有参数的,就一定要加,还有参数值,参数值的类型要与变量类型相同.3 在语句块中进行调用过程,这个方式和命令模式类似,他们都是可要可不要(),-- 在2 和 3 中的 没有括号的情况是,过程没有参数 ,如果有,就必须要有()输出参数的特点1 一个过程中,如果有输出参数(OUT 参数),在调用过程的使用,也要传入一个参数, 这个参数可以不用在调用的地方进行赋值,就直接传入一个声明好的一个变量,用来接受存储过程中的输出参数的值(OUT 参数)2 输入参数 值不可以改变在过程中,注意: 在存储过程中,他的参数类型不可以设置它的大小 ; 例如;CREATE OR REPLACE PROCEDURE hello(
p_name IN VARCHAR2(12),
p_age OUT NUMBER(10,2)
如果有输出参数就必须有有一个参数进行接收 ;CREATE OR REPLACE PROCEDURE hello(
p_name IN VARCHAR2,
p_age OUT emp.sal%TYPE
SELECT emp.sal + 3131 INTO p_age FROM emp WHERE empno = 7788 ;
dbms_output.put_line( p_age);
--------- 块中调用方法DECLARE
v_nanme varchar2(12);
v_age NUMBER (12,2);
hello (v_nanme,v_age);
dbms_output.put_line(v_age);
-- 在这个过程中 传入的v_age 就是接受 存储过程输出参数的值 ; 类似于Java的中的返回值
-- 理解 in out 参数
CREATE OR REPLACE PROCEDURE hello1 (
p_name IN OUT emp.ename%TYPE
-- SELECT emp.ename INTO p_name FROM
p_name:='a;sk , ' || p_
--------------------------------------------------------------------------
v_nanme varchar2(12);
v_nanme:='12312';
hello1(v_nanme);
补充:sqlplus中执行含有输出参数为游标的存储过程
sqlplus创建存储过程,使用如下:SQL&create or replace procedure test1(rcursor out sys_refcursor) as
open rcursor for
select decode(row_number() over(partition by deptno order by ename),
null) deptno,
from scott.
--使用sqlplus执行上面创建的带有游标输出参数的存储过程SQL& var cur refcursor
SQL& exec test1(:cur);
PL/SQL procedure successfully completed.
SQL& print
DEPTNO ENAME
---------- ----------
DEPTNO ENAME
---------- ----------
14 rows selected.动态规划及其详解步骤_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者贡献于
评价文档:
64页免费74页免费19页免费59页免费4页免费 82页免费76页免费32页2下载券37页2下载券18页1下载券
喜欢此文档的还喜欢289页免费88页免费4页7下载券60页免费33页免费
动态规划及其详解步骤|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
大小:753.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢教师讲解错误
错误详细描述:
阅读下面的解题过程并回答问题.计算:.解:原式:(第一步)=(-15)÷(-25)(第二步)(第三步)(1)上面的解题过程有两处错误:第一处是第________步,错误原因是________;第二处是第________步,错误原因是________.(2)正确结果是________.
下面这道题和您要找的题目解题方法是一样的,请您观看下面的题目视频
阅读下面的解题过程:计算:解:原式(第一步)(第二步)(第三步)回答:(1)上面解题过程中有两处错误,第一处错误是第________步,错误原因是________;第二处错误是第________步,错误原因是________.(2)正确的结果是________.
电话:010-
地址:北京市西城区新街口外大街28号B座6层601
微信公众号
COPYRIGHT (C)
INC. ALL RIGHTS RESERVED. 题谷教育 版权所有
京ICP备号 京公网安备阅读下面的文字,完成解答过程.(1)$\frac{1}{1×2}$=1-$\frac{1}{2}$,$\frac{1}{2×3}$=$\frac{1}{2}$-$\frac{1}{3}$,$\frac{1}{3×4}$=$\frac{1}{3}$-$\frac{1}{4}$,则$\frac{1}{}$=,并且用含有n的式子表示发现的规律.(2)根据上述方法计算:$\frac{1}{1×3}$+$\frac{1}{3×5}$+$\frac{1}{5×7}$+…+$\frac{1}{}$.(3)根据(1),(2)的计算,我们可以猜测下列结论:$\frac{1}{n(n+k)}$=(其中n,k均为正整数),并计算$\frac{1}{1×4}$+$\frac{1}{4×7}$+$\frac{1}{7×10}$+…+$\frac{1}{}$.
提 示 请您或[登录]之后查看试题解析 惊喜:新手机注册免费送20天VIP和20个雨点!无广告查看试题解析、半价提问Tonyguo 的BLOG
用户名:Tonyguo
文章数:60
评论数:569
访问量:383909
注册日期:
阅读量:9744
51CTO推荐博文
5984人学习
1317人学习
1. DHCP Server
DHCPIPUDP 67DHCPDISCOVERMAC0.0.0.0255.255.255.255DHCP discover
DHCP discover1DHCP discover1DHCP discover248161-1000DHCP Server169.254.0.0/16IPIP5IP
DHCP ServerDHCP discoverIPTCP/IPUDP 68DHCP OFFERIPIPDHCP ServerIP255.255.255.255DHCP ServerIPDHCPIP
IPDHCP discoverMACXIDDHCP ServerDHCP OFFER
DHCPDHCP OFFERDHCP REQUESTMACIPDHCPDHCP ServerIPDHCPIPIPDHCP Server0.0.0.0IP255.255.255.255
DHCPDHCP ServerOFFERTCP/IPDHCP REQUESTDHCPDHCP Option FieldTCP/IP
DHCP ServerDHCP REQUESTDHCP ACKIP
DHCP ACKIPARPIPIPDHCP DECLINEDHCP ServerIPDHCP discoverDHCPIPBAD_ADDRESS
IPTCP/IPIP
50%IPDHCP ServerDHCP REQUESTDHCP ACKTCP/IPIPIP50%
50%87.5%IPDHCP100%IPDHCP169.254.0.0/165本文出自 “” 博客,转载请与作者联系!
了这篇文章
类别:未分类┆阅读(0)┆评论(0)
14:47:24 19:49:25 17:25:47 10:55:39 16:01:30 09:57:09 13:28:45 12:03:07 12:04:57 16:59:45}

我要回帖

更多关于 小学数学题在线解答 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信