存储过程(procedure)

博客主要介绍存储过程相关知识。包括创建与执行,如创建不带参数的存储过程修改员工姓名,带参数的存储过程计算指定系总学分大于40的人数;还涉及提高篇内容,如返回多个值的存储过程、存储过程与游标结合及模糊查询等。

一、存储过程的创建与执行

1.不带参数的存储过程

创建一存储过程update_emp,该过程用于将emp表中empno7876的员工姓名修改为candy

//注意在程序窗口中写procedure的创建,写完后要编译
create or replace procedure p1
is 
begin 
  update scott.emp set ename='candy'where empno=7876;
end p1;

//在命令窗口中写procedure的调用
begin
  p1;
end;

2.带参数的存储过程((一个in,一个out)

计算指定系总学分大于40的人数

(指定系参数模式---in,大于40的人数参数模式---out)

//创建
create or replace procedure p2(v_zym in xs.zym%type,person_num out number)
或者
CREATE OR REPLACE PROCEDURE p2(v_zym in varchar2,person_num out number) //注意字符型变量不带长度
as
begin 
  select count(zxf) into person_num from xs where zym=v_zym and zxf>=40;
end p2;

//调用
declare
  person_n number(3);
begin
  p2('计算机',person_n);
  dbms_output.put_line(person_n);
end;

补充:rownum的应用(注意:rownum只能在具体表中应用)

编写一个存储过程,计算显示部门人数最多的部门号、人数及平均工资。
create or replace procedure p1
is
v_deptno scott.emp.deptno%type;
v_pn number;
v_avg scott.emp.sal%type;
begin
  select deptno,personNum,avgSal into v_deptno,v_pn,v_avg from 
(select deptno,count(*) personNum,avg(sal) avgSal from scott.emp
 group by deptno
 order by personNum desc) //括号括起来放到from后面相当于一个表
 where rownum<=1; //条数为1
 dbms_output.put_line(v_deptno||' '||v_pn||' '||v_avg);
 end p1;
 
 begin
   p1;
 end;

二、存储过程提高篇

1.返回多个值的存储过程(一个in,两个out)

创建一个存储过程,以部门号为参数,返回该部门的人数和平均工资。
create or replace procedure p2
(p_deptno in scott.emp.deptno%type,
p_avgsal out scott.emp.sal%type,
p_count out scott.emp.sal%type)
as
begin
  select avg(sal),count(*) into p_avgsal,p_count from scott.emp where deptno=p_deptno;
end p2;

declare 
   v_avgsal scott.emp.sal%type;
   v_count scott.emp.sal%type;
begin
  p2(20,v_avgsal,v_count);
  dbms_output.put_line(v_avgsal||' '||v_count);
end;

注意:形参为OUT类型的参数需要在procedure的begin块中赋值。(一般有select into 赋值) 

2. 存储过程与游标结合

例子:创建一个存储过程,以部门号为该存储过程的in类型参数,查询该部门的平均工资,并输出该部门中比平均工资高的员工号、员工名。
注意:用到了(for 循环遍历  游标)
create or replace procedure p3(
v_deptno  scott.emp.deptno%type)
is
v_sal scott.emp.sal%type;
begin
  select avg(sal) into v_sal from scott.emp where deptno=v_deptno;
  dbms_output.put_line(v_deptno||' '||'average salary is: '||v_sal);
 for v_emp in(select * from scott.emp where deptno=v_deptno and sal>v_sal) //注意此句
  loop
    dbms_output.put_line(v_emp.deptno||' '||v_emp.ename);
  end loop;
end p3;

begin
  p3(20);
end;

3.模糊查询

select * from scott.emp where ename like '%A%';

例子:用存储过程进行模糊查找,如查找ename中包含L的雇员信息
create or replace procedure p4(
v_ename scott.emp.ename%type)
is
  cursor c_1 is select * from scott.emp where ename like '%'||v_ename||'%'; //与游标结合
begin
 for v_1 in c_1
  loop
    dbms_output.put_line(v_1.empno||' '||v_1.ename||' '||v_1.job||' '||v_1.deptno);
  end loop;
end p4;

begin
  p4('L');
end;
### StarRocks 存储过程 (PROCEDURE) 使用方法 StarRocks 支持存储过程Procedure),这是一种可以封装复杂逻辑重复使用的据库对象。以下是关于 StarRocks 中 `PROCEDURE` 的语法及其使用示例。 #### 创建存储过程 在 StarRocks 中,可以通过 `CREATE PROCEDURE` 语句定义一个新的存储过程。其基本语法如下: ```sql CREATE PROCEDURE procedure_name(param1 type, param2 type, ...) BEGIN -- SQL statements or logic here END; ``` - **procedure_name**: 存储过程的名字。 - **param1**, **param2**: 可选参,用于传递输入据到存储过程中。 例如,下面是一个简单的存储过程示例,它接受一个日期字符串作为参返回该日期对应的年份[^3]。 ```sql DELIMITER $$ CREATE PROCEDURE get_year(IN date_str VARCHAR(50)) BEGIN DECLARE year_val INT; SET year_val = CAST(SUBSTRING_INDEX(date_str, '-', 1) AS SIGNED); SELECT CONCAT('Year is ', year_val); END$$ DELIMITER ; ``` 此存储过程的功能是从给定的日期字符串中提取年份部分,将其转换为整形式显示出来。 #### 调用存储过程 一旦创建了存储过程,就可以通过 `CALL` 命令来行它。调用上面定义的过程的方法如下所示: ```sql CALL get_year('2023-07-18'); ``` 这会输出类似于 `'Year is 2023'` 的结果。 #### 删除存储过程 如果不再需要某个特定的存储过程,则可利用 `DROP PROCEDURE` 来移除它: ```sql DROP PROCEDURE IF EXISTS get_year; ``` 以上命令会在存在名为 `get_year` 的存储过程时删除之;如果没有找到对应名称的过程则不会报错。 --- ### 注意事项 尽管 StarRocks 提供了对存储过程的支持,但在实际应用当中需要注意以下几点: - 不同于传统的关系型据库管理系统(RDBMS),如 MySQL 或 PostgreSQL,StarRocks 更专注于大规模据分析场景下的高性能查询处理能力。因此,在设计涉及大量计算或者循环操作的存储过程时需谨慎考虑性能影响。 - 当前版本可能对于某些高级特性支持有限,请参照官方文档获取最新功能更新情况[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值