本文主要介绍oracle过程的知识,包括Oracle存储过程中的注意事项。很不错,有参考价值。有需要的朋友可以参考一下。
关键字: oracle 存储过程
1.基本结构
或替换过程存储过程名
(
参数1的数量,
参数2个数
)是
1可变整数:=0;
变量2日期;
开始
结束存储过程名
2.SELECT INTO STATEMENT
select查询的结果可以存储在变量中。多个列可以同时存储在多个变量中。必须有一列。
记录,否则抛出异常(如果没有记录,抛出NO_DATA_FOUND)
示例:
开始
从typestruct中选择col1、col2到变量1、变量2,其中xxx
例外
当没有找到数据时
xxxx
结束;
.
3.IF 判断
如果V_TEST=1,则
开始
做某事
结束;
结束IF;
4.while 循环
当V_TEST=1循环时
开始
XXXX
结束;
结束循环;
5.变量赋值
v _ TEST:=123;
6.用for in 使用cursor
.
是
光标cur是SELECT * FROM xxx
开始
对于曲线循环中的cur_result
开始
V_SUM :=cur_result列名1 cur_result。列名2
结束;
结束循环;
结束;
7.带参数的cursor
游标C_USER(C_ID NUMBER)是从用户中选择的名称,其中TYPEID=C _ ID
C _ user(变量值);
环
将C_USER提取到V_NAME中;
退出FETCH C _ USER % NOTFOUND
做某事
结束循环;
关闭C _ USER
8.用pl/sql developer debug
连接到数据库后,建立一个测试窗口。
在窗口中输入调用SP的代码,F9开始调试,Ctrl N单步调试。
转载:
oracle 存储过程
关键词:oracle存储过程
存储过程创建语法:
或者替换过程存储过程名称(param1 in type,param2 out type)
如同
1变量类型(值域);
2变量类型(取值范围);
开始
Select (*) into表A中的变量1,其中列名=param1
如果(判断条件)那么
从表A中选择变量2的列名,其中列名=param1
Dbms_output .Put _ line('打印信息');
Elsif(判断条件)那么
Dbms_output .Put _ line('打印信息');
其他
引发异常名称(NO _ DATA _ FOUND);
结束if;
例外
当其他人
回滚;
结束;
注意事项:
1,存储过程参数没有取值范围,in表示传入,out表示输出。
2,变量带取值范围,后跟分号
3.在判断语句之前,最好使用count(*)函数判断操作记录是否存在。
4.使用选择。变成了.给变量赋值
5、在代码中抛出异常,并抛出异常名
例外命名于
命名系统异常的原因
ACCESS_INTO_NULL对象未定义。
如果CASE_NOT_FOUND CASE不包含相应的WHEN且未设置
否则时间
COLLECTION_IS_NULL集合元素未初始化。
CURSER_ALREADY_OPEN游标已经打开。
与DUP _瓦尔_开_索引的唯一索引对应的列中有重复值
INVALID_CURSOR对非法游标进行操作。
INVALID_NUMBER嵌入式SQL语句无法将字符转换为数字。
NO_DATA_FOUND使用select into不返回任何行,或者应用未初始化的索引表。
To _ many _ rows执行select into时,结果集超过一行。
ZERO_DIVIDE除数为0。
SUBSCRIPT_BEYOND_COUNT元素下标超过了嵌套表或VARRAY的最大值。
使用嵌套表或VARRAY时,SUBSCRIPT_OUTSIDE_LIMIT将下标指定为负数。
赋值VALUE_ERROR时,变量长度不足以容纳实际数据。
当LOGIN_DENIED PL/SQL应用程序连接到oracle数据库时,它提供no
正确的用户名或密码
NOT_LOGGED_ON PL/SQL应用程序未连接到oralce数据库
存取数据
PROGRAM_ERROR PL/SQL中存在内部问题。可能需要重新安装数据字典& pl。/SQL。
系统包
ROWTYPE_MISMATCH主机游标变量与PL/SQL游标变量的返回类型不兼容。
SELF_IS_NULL在使用对象类型时调用NULL对象上的object方法。
运行PL/SQL时,STORAGE_ERROR超出内存空间
SYS_INVALID_ID的ROWID字符串无效
TIMEOUT_ON_RESOURCE Oracle在等待资源时超时
语法及示例:
1、存储过程创建存储过程的语法:
CREATE[OR REPLACE]PROCEDURE PROCEDURE _ name[(parameter _ list)]{ IS | AS }[local _ declarations]begin executable _ statements[exception exception _ handlers]END[PROCEDURE _ name];
其中:过程名称是过程的名称。
参数列表是参数列表。
局部_声明是局部声明。
可执行_语句是可执行语句。
异常处理程序是异常处理程序。
示例1:
演示创建过程(参数列表中为在…里参数赋予一个默认值,不能为出去、进来、出去参数赋予默认值)
创建或替换过程find _ EMP(EMP _ no in number:=7900)作为empname varchar 2(20);begin select ename into EMP name from EMP where empno=EMP _ no;dbms_output.put_line('雇员姓名是| | empname);异常当no _ data _ found then DBMS _ output。put _ line('雇员编号未找到');结束查找_员工
调用过程:
执行过程名称(参数列表);
也可以在过程里面调用,直接写上过程名称而不必写执行。
示例2:演示创建带在外参数的过程
创建或替换程序测试(值1 varchar2,值2 out number)是标识号;开始从EMP中选择sal进入身份,其中empno=值1如果身份2000,那么值2:=1000;else值2:=500;结束如果;结束;
调用带在外参数的过程:
申报值2号;开始测试("7900",值2);DBMS _ outputput _ line(值2);结束;
示例3:
演示创建带输入/输出参数的过程
创建或替换过程交换(p1输入输出编号,p2输入输出编号)是v _ temp number begin v _ temp:=P1;P1:=p2;p2:=v _ temp;结束;
调用带输入/输出参数的过程:
声明num1号:=100;num2数:=200;开始交换(num1,num 2);DBMS _ outputput _ line(' num 1=' | | num 1);DBMS _ outputput _ line(' num 2=' | | num 2);结束;
示例4:将过程的执行权限授予其他用户
将查找_员工上的执行授予斯科特将对交换的执行授权给公众的
将查找_员工过程的执行权限授予给用户斯科特,将执行交换过程的权限授予所有数据库用户。
删除过程语法:
删除过程过程名
2、函数 定义函数的语法如下:
CREATE[OR REPLACE]FUNCTION FUNCTION _ name[(parameter _ list)]RETURN datatype { IS | AS }[local _ declarations]BEGIN executable _ statements[EXCEPTION EXCEPTION _ handlers]END[FUNCTION _ name];
其中:功能名称是函数的名称。
参数列表是参数列表。
局部_声明是局部声明。
可执行_语句是可执行语句。
异常处理程序是异常处理程序。
使用函数时注意:形式参数必须只使用数据库类型,不得使用PL/SQL类型。函数的返回类型也必须是数据库类型。函数不能单独执行,只能通过结构化查询语言语句或PL/SQL程序块来调用。
示例5:
演示如何创建函数
创建或替换函数fun_hello return varchar2是'开始返回'朋友,您好;结束;
调用函数:
从双重的中选择好玩_你好
函数的授权:同过和的授权一样具体请看示例4。
删除函数:
丢弃功能函数名
过程和函数的差异过程函数作为PL/SQL语句执行作为表达式的一部分调用在规范中不包含返回子句必须在规范中包含返回子句不返回任何值必须返回单个值可以包含返回语句,但是与函数不同,它不能用于返回值必须包含至少一条返回语句
3、程序包 创建包规范的语法:
创建[或替换]包包名是| AS[公共类型和项声明][子程序规格]END[包名];
其中:包名是包的名称。
公共类型和项声明是声明类型、常量、变量、异常和游标等子程序规格声明PL/SQL子程序。
示例6:
演示创建程序包规范
创建或替换包打包_操作是过程pro_print_ename(id号);过程pro_print_sal(id号);函数有趣的约会(身份证号)返回日期;结束;
创建包主体的语法:
创建[或替换]程序包体包名是| AS[公共类型和项声明][子程序体][BEGIN initial ization _ statements]END[PACKAGE _ name];
其中:包名是包的名称。
公共类型和项声明是声明类型、常量、变量、异常和游标等。
子程序体是定义公共和私有PL/SQL子程序。
示例7:演示创建程序包主体
创建或替换包体pack _ op是过程pro _ print _ ename(id号)是名称EMP . ename % type begin select ename into name from EMP其中empno=iddbms_output.put_line('职员姓名:' | | name);end pro _ print _ ename过程pro_print_sal(id号)是薪金雇员sal %类型;begin select sal into salary from EMP where empno=id;dbms_output.put_line('职员工资:' | |工资);结束pro _ print _ sal函数有趣的约会(id号)返回日期为bedate emp.hiredate % typebegin从电磁脉冲中选择租用日期到bedate,其中empno=id返回bedateend fun _ re _ dateend pack _ op
示例8:调用程序包中创建的过程和函数
exec pack _ op . pro _ print _ ename(7900);exec pack _ op . pro _ print _ sal(7900);从双重的中选择pack _ op . fun _ re _ date(7900);
示例9:演示程序包中的游标创建包规范
创建或替换包打包_员工是cursor cur _ EMP返回EMP % rowtype过程pro _ cur端包_ emp
创建包主体
创建或替换包体pack _ EMP是cur _ EMP return EMP % rowtype是select * from EMP过程pro_cur是rec _ EMP EMP % row type begin open cur _ EMP将当前雇员循环提取到记录_员工中;当cur _ emp %未找到时退出;如果rec_emp.sal1000,则dbms_output.put_line('员工工资:' ||rec_emp.sal|| ',需加倍努力争取提高工资');elsif rec_emp.sal=1000和2000年然后dbms_output.put_line('员工工资:' ||rec_emp.sal|| ',工资一般,争取搞个部门经理做做');else dbms_output.put_line('员工工资:' ||rec_emp.sal|| ',工资不错,争取搞个总经理做做');结束如果;结束循环;end pro _ cur端包_ emp
调用程序包中的过程以调用程序包中的游标
执行包装_雇员.专业_当前
示例10:存储过程返回游标的子程序包(此程序包返回r _当前游标)
创建或替换包斯科特。PK _ wt是类型mytype是引用游标;过程p _ wt(mycs out mytype);结束;
创建或替换包体SCOTT.pk_wt是过程p _ wt(mycs out mytype)是r _ cur mytype从电磁脉冲开始为选择*打开r _ curmycs:=r _ cur;结束p _ wt结束pk _ wt
查询有关过程、函数和程序包的信息:
用户对象数据字典视图列对象名称格式a18 select object_name,object _ type from user _ objects where object _ type in(' PROCEDURE ',' FUNCTION ',' PACKAGE ',' PACKAGE BODY ');
以上所述是小编给大家介绍的神谕过程知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。