Oracle:存储过程(二)
一:存储过程中其常用的基础语法总结
(1)存储过程结构:
AS/IS在存储过程(PROCEDURE)和函数(FUNCTION)中没有区别;在视图(VIEW)中只能用AS不能用IS;在游标(CURSOR)中只能用IS不能用AS。
1 2 3 4 5 6 | CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数 1 IN NUMBER, 参数 2 IN NUMBER ) IS 变量 1 INTEGER := 0 ; 变量 2 DATE; BEGIN --执行体 END 存储过程名字; |
(2)变量赋值:
1 | V_TEST := 123 ; |
(3)SELECT INTO STATEMENT
--将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
1 2 3 4 5 6 | BEGIN --执行体 SELECT col1,col2 into 变量 1 ,变量 2 FROM typestruct where xxx; EXCEPTION WHEN NO_DATA_FOUND THEN -- select into 语句没有符合条件的记录返回 xxxx; END; |
(4)IF 语句:
1 2 3 4 5 | IF V_TEST = 1 THEN BEGIN do something END; END IF; |
(5)WHILE 语句
1 2 3 4 5 | WHILE V_TEST= 1 LOOP BEGIN XXXX END; END LOOP; |
(6)FOR 语句
1 2 3 4 5 | FOR CUR_PARAM IN CUR_PARAMS LOOP BEGIN XXXX END; END LOOP; |
(7)CURSOR 使用
1)FOR IN 方式:
1 2 3 4 5 6 7 8 9 | IS CURSOR cur IS SELECT * FROM xxx; BEGIN FOR cur_result in cur LOOP BEGIN V_SUM :=cur_result.列名 1 +cur_result.列名 2 END; END LOOP; END; |
2)非FOR IN方式无参:
1 2 3 4 5 | CURSOR C_USER IS SELECT NAME FROM USER; OPEN C_USER; FETCH C_USER INTO V_NAME; EXIT WHEN FETCH C_USER%NOTFOUND; CLOSE C_USER; |
3)非FOR IN方式带参CURSOR:
1 2 3 4 5 | CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID; OPEN C_USER(变量值); FETCH C_USER INTO V_NAME; EXIT WHEN FETCH C_USER%NOTFOUND; CLOSE C_USER; |
二:存储过程中游标的使用
(1)方式一:直接定义游标
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | create or replace procedure test1 is begin declare cursor emp_sor is select ename,sal from emp where deptno= 10 ; cname emp.ename%type; csal emp.sal%type; begin open emp_sor; loop fetch emp_sor into cname,csal; --取游标的值给变量。 exit when emp_sor%notfound; dbms_output.put_line( 'ename:' ||cname|| 'sal' ||csal); end loop; close emp_sor; end; end test1; |
(2)方式二:用for取值,带隐式游标会自动打开和关闭
1 2 3 4 5 6 7 8 9 10 11 12 | create or replace procedure test2 is begin declare cursor emp_sor is select a.ename from emp a; type emp_table_type is table of varchar( 20 ); begin for emp_record in emp_sor loop dbms_output.put_line( '第' ||emp_sor%rowcount|| '雇员名:' ||emp_record.ename); end loop; end; end test2; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通