存储过程的常用语法

1。存储过程的概念:

1。存储过程Procedure是一组完成特定功能的SQL语句。 被编译并存储在数据库 中。用户通过指定存储过程的名称并给出参数来执行

2。存储过程可以包含逻辑控制语句和数据操作语句。它可以接受参数、输出参数、返回单个或多个结果集以及返回值

3。由于存储过程是在数据库服务器上编译并在创建时存储在数据库中的,因此存储过程的运行速度比单个 SQL 语句块要快。同时,由于调用时只需要提供存储过程名称和必要的参数信息,因此也可以在一定程度上减少网络流量,简化网络负担。


存储过程基础知识:

1。 Oracle存储过程结构:

CREATE OR REPLACE PROCEDURE 存储过程名称
(
输入输出参数
)
是
变量定义位置
开始
代码;END存储过程名称;

2。基本变量类型:

1、CHAR类型:'固定长度字符串'(会用空格填充以达到最大长度),如果不指定CHAR的长度,默认为1,最大为2000字节

2、NCHAR 类型:包含 UNICODE 格式数据的“定长字符串”。如果定义为NCHAR类型,模糊查询的写法如下:

select * from INSERTTEST t where t.qq like '%daa21%' 查询的值必须是 '%content%'

    NICODE格式数据:Unicode,Universal Code,Unicode)是计算机科学领域的行业标准,

包括字符集、编码方案等(统一唯一的二进制编码)

3、VARCHAR类型: --->最好不要使用

4、VARCHAR2类型:'变长字符串'最大4000字节

5、NVARCHAR2类型:与Nchar类似,包含UNICODE格式数据的“变长字符串”

6、数字类型: 数字(P、S)是最常见的数字类型

7、INTEGER类型:NUMBER的子类型,相当于NUMBER(38,0),用于存储整数,

如果插入或更新的值包含小数,则会四舍五入

8,浮点数

(1)BINARY_FLOAT:32 位单精度浮点数值数据类型

(2)BINARY_DOUBLE:64 位双精度浮点数值数据类型

9、FLOAT类型:也是NUMBER的子类型,

Float(n),数字n表示位精度,可以存储的值的个数。 N值的范围可以从1到126

10、DATE类型:一般占用7个字节的存储空间

11、TIMESTAMP 类型 :这是 7 字节或 12 字节固定宽度日期/时间数据类型。与DATE数据类型不同,

因为 TIMESTAMP 可以包含小数秒,所以带有小数秒的 TIMESTAMP 最多可以保留小数点右侧 9 位数字

12、LONG类型:存储变长字符串,最大2G字符数据

3。存储过程if语句:

if 逻辑表达式 then 内容
Elsif 逻辑表达式 then 内容
其他内容
结束如果;

4。 Oracle存储过程中:=和=有什么区别

:= 为赋值符号,例如:a := 2,则变量 a 的值为 2

= 是比较符号,例如:... WHERE 字段名称 = 2,与 > < 是相同属性

5。光标和循环

创建或替换过程 yzy_test()istype myCur 是引用游标;cur myCur;returnValue VARCHAR2(3000);SelectSQL VARCHAR2(3000);
beginSelectSQL:= '从 yzy_test 选择测试';为 SelectSQL 打开 cur;当 cur%notfound 时循环退出; --当光标属于notfound时,直接弹出fetch cur into returnValue;end循环;close cur;EXCEPTION WHEN OTHERS THEN--存储过程错误走这里
结束 yzy_test;

这里需要注意的是exit when cur%notfound 这句话中,有时候光标的notfound 值可能是大写或者小写,这个地方是区分大小写的,如果不加这句话,结果就是一直循环,不会弹出。

6。使用临时表返回数据SYS_REFCURSOR作为临时表

创建或替换过程 SP_TEST(C_RES OUT SYS_REFCURSOR) AS
V_SQL VARCHAR2(1000);BEGINV_SQL:='开始打开:C_RES FOR SELECT * FROM DUAL; END;';使用C_RES执行立即V_SQL;END SP_TEST; 

说明:EXECUTE IMMEDIATE执行SQL,

或 PL/SQL 块,因此添加 BEGIN...END、

                          还传递 C_RES 作为绑定变量。

7。打印并执行sql

创建或替换程序测试
v_sql varchar2(2000);--定义一个变量来存储sql语句
beginv_sql:='insert into test1 values(sysdate)';--给sql赋值 dbms_output.put_line(v_sql);--打印执行立即v_sql;--执行sqlcommit;
测试结束;

sql查询:select * from test1;

结果:

8。自主交易--自定义交易(独立)

添加PRAGMA AUTONOMOUS_TRANSACTION;存储过程上面开始成为自治事务

自治事务从当前事务开始并在其自己的上下文中执行。它们可以独立提交或重新运行,而不影响正在运行的事务。因此,它们是编写错误日志表的理想形式。当在事务中检测到错误时,您可以在错误日志表中插入一行并提交,然后回滚主事务,而不会丢失此插入。 (回滚;--回滚)

创建或替换过程 insertLog(LogValue in varchar2)isv_sql varchar2(2000);--定义一个变量来存储sql语句
PRAGMA 自主事务;
beginv_sql:='insert into test1(id,date1,logvalue)values(sys_guid(),sysdate,'''||LogValue||''')';--给sql赋值 dbms_output.put_line(v_sql) ;-- 打印执行立即v_sql;--执行sqlcommit;end insertLog;

9。如何检测存储过程中的错误

beginEXCEPTION WHEN OTHERS THEN 存储过程出差回滚后到这里;end 存储过程名称;

10。当面对大量数据进行联合查询、修改场景时,使用merge into ...using() on...

创建或替换过程merge_test是
beginMERGE INTO user_test a USING (select id from order_test) b ON (www.sxzhongrui.com=www.sxzhongrui.com)WHEN MATCHED THENUPDATE SET www.sxzhongrui.com =3WHEN NOT MATCHED THEN insert (id,USERNUME,sex) values(sys_guid(),'match不上',5);提交;
结束合并测试;

-------------------------------------

含义:匹配user_test a,使用(select id from order_test)b作为查询结果,使用on建立联系,匹配时使用update,

我将其与 INSERT 相匹配。

注意:ON中的条件不能作为update中设置的条件

结果:

十一、退出并回滚

退出 --结束可用场景:跳出循环

回滚 --回滚出差时回滚,保证运行事务后数据不丢失

12。将查询数据分配给变量

从 Dual 选择 to_date(vgfrq1,'yyyy/mm/dd') 到 vgfrq 中;

13。 INSERT ALL 向多个表中插入数据(带条件和游标循环)

准备:

从user_test中选择*;

用途:

创建或替换过程 SP_more_insert isS_id varchar(500);type myCur is refcursor;cur myCur;beginopen cur for SELECT www.sxzhongrui.com from user_test a where a.address = 'YZY';LOOPFETCH cur INTO S_id;EXIT WHEN cur%NOTFOUND;--带条件多表插入insert ALL WHEN S_id='0' THENINTO one_test(id, va,ass) 当 S_id='1' THENINTO Two_test(id,va,ass) 当 S_id='10' THENINTO Three_test(id,va,ass) 从 user_test a 中选择 sys_guid(),a.usernume,a.address a.address = 'YZY' 且 www.sxzhongrui.com = S_id; commit;END LOOP;close cur;其他时候出现异常insertLog('SP_more_insert出差!!!');rollback;
结束 SP_more_insert;

效果: