create or replace procedure tongji is v_sql varchar2(100); begin v_sql :='create table emp_work_detail as select distinct name,id,mouth,startwork,endwork, case when to_char(startwork,''hh24:mi'')>''09:00'' then ''是'' else ''否'' end chidao, case when (endwork-startwork)*24>8.5 then ''是'' else ''否'' end jiaban, case when to_char(endwork,''hh24:mi'')<''17:30'' then ''是'' else ''否'' end zhaotui from( select distinct name,id,to_char(SIGNIN_DATETIME,''yyyy-mm'') mouth, first_value(signin_datetime) over(partition by id,to_char(signin_datetime,''dd'') order by signin_datetime) startwork, last_value(signin_datetime) over(partition by id,to_char(signin_datetime,''dd'')) endwork from emp_work order by id)'; execute immediate v_sql; end; /
时间: 2023-09-18 10:13:14 浏览: 60
这段代码是一个 PL/SQL 存储过程,它的作用是创建一个名为 emp_work_detail 的表,并将 emp_work 表中的数据按照一定的条件进行汇总后插入 emp_work_detail 表中。其中,使用了动态 SQL 的方法,将 SQL 语句保存在一个变量中,然后使用 EXECUTE IMMEDIATE 语句动态地执行这个 SQL 语句。
具体来说,这个存储过程的实现过程如下:
1. 定义一个名为 v_sql 的 varchar2 类型的变量,用来保存要执行的 SQL 语句。
2. 将要执行的 SQL 语句保存在 v_sql 变量中。这个 SQL 语句的作用是从 emp_work 表中选择出每个员工每个月的第一次签到时间作为上班时间,最后一次签到时间作为下班时间,并根据一定的条件计算出是否迟到、是否加班、是否早退,并将这些数据插入到 emp_work_detail 表中。
3. 使用 EXECUTE IMMEDIATE 语句执行保存在 v_sql 变量中的 SQL 语句。
4. 存储过程执行完毕。
需要注意的是,这段代码中使用了动态 SQL 的方法,这样做的好处是可以根据实际情况动态地构建 SQL 语句,但也存在一定的安全风险,因此需要注意对动态 SQL 的合法性进行判断,避免 SQL 注入等安全问题。
相关问题
create or replace procedure tongji is v_sql varchar2(100); begin v_sql :='create table emp_work_detail as select distinct name,id,mouth,startwork,endwork, case when to_char(startwork,'hh24:mi')>'09:00' then '是' else '否' end chidao, case when (endwork-startwork)*24>8.5 then '是' else '否' end jiaban, case when to_char(endwork,'hh24:mi')<'17:30' then '是' else '否' end zhaotui from( select distinct name,id,to_char(SIGNIN_DATETIME,'yyyy-mm') mouth, first_value(signin_datetime) over(partition by id,to_char(signin_datetime,'dd') order by signin_datetime) startwork, last_value(signin_datetime) over(partition by id,to_char(signin_datetime,'dd')) endwork from emp_work order by id)'; execute immediate v_sql; end; /
这段代码存在一个语法错误,即在动态 SQL 语句中使用了单引号,但是单引号已经被用作字符串的标识符了。解决方法是将单引号进行转义,例如将 'hh24:mi' 改为 ''hh24:mi''。修改后的代码如下:
```
create or replace procedure tongji is
v_sql varchar2(100);
begin
v_sql := 'create table emp_work_detail as
select distinct name, id, to_char(signin_datetime, ''yyyy-mm'') mouth,
first_value(signin_datetime) over(partition by id, to_char(signin_datetime, ''dd'') order by signin_datetime) startwork,
last_value(signin_datetime) over(partition by id, to_char(signin_datetime, ''dd'')) endwork,
case when to_char(first_value(signin_datetime) over(partition by id, to_char(signin_datetime, ''dd'') order by signin_datetime), ''hh24:mi'') > ''09:00'' then ''是'' else ''否'' end chidao,
case when (last_value(signin_datetime) over(partition by id, to_char(signin_datetime, ''dd'')) - first_value(signin_datetime) over(partition by id, to_char(signin_datetime, ''dd'')))*24 > 8.5 then ''是'' else ''否'' end jiaban,
case when to_char(last_value(signin_datetime) over(partition by id, to_char(signin_datetime, ''dd'')), ''hh24:mi'') < ''17:30'' then ''是'' else ''否'' end zhaotui
from emp_work order by id';
execute immediate v_sql;
end;
/
```
修改后的代码使用了两个单引号来表示一个单引号,从而避免了语法错误。同时,对动态 SQL 语句进行了一些微调,使得结果更加准确。
在Employee表上建立触发器tr_rs实现统计表(tongji)数据的实时更新(新增1个雇员进行验证,编号:50,姓名:zds,性别:男,薪水:3500,部门编号:4,其余列留空)
好的,以下是在MySQL数据库上创建触发器tr_rs的SQL语句,可以实现对Employee表的操作并实时更新tongji表:
```sql
CREATE TRIGGER tr_rs
AFTER INSERT ON Employee
FOR EACH ROW
BEGIN
INSERT INTO tongji (deptno, count, avg_sal)
SELECT deptno, COUNT(*), AVG(salary)
FROM Employee
GROUP BY deptno;
END;
```
在这个触发器中,我们指定了在Employee表上进行插入操作时触发,每次插入一行数据时都会执行触发器内部的代码。代码中首先对tongji表进行操作,插入部门编号、员工人数、平均工资等数据,通过SELECT语句从Employee表中查询得到,然后进行分组统计。这样,每次插入新的员工数据时,tongji表中的数据都会被实时更新。
注意,这里我们假设tongji表已经存在,并且已经包含了部门编号、员工人数、平均工资等列。如果tongji表不存在,需要先使用CREATE TABLE语句创建该表。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)