oracle 简答创建一个监听器记录对某张表的操作记录

本文介绍了一个用于强化数据安全性的表操作监听器实现方案。通过创建监听器tri_SM_MOBILE_SOFTVERSION,可以记录对表SM_MOBILE_SOFTVERSION的所有插入、更新和删除操作。

需求:        

在工作中遇到个需求,就是为了强化数据的安全性,需要创建一个监听器来监听对某一张表的操作记录。

方案:

创建一个监听器tri_SM_MOBILE_SOFTVERSION:
create or replace trigger tri_SM_MOBILE_SOFTVERSION
before insert or update or delete
on SM_MOBILE_SOFTVERSION
declare 
var_tag varchar2(10);
begin 
  if inserting then
    var_tag := '插入';
  elsif updating then
    var_tag := '修改';
  elsif deleting then
    var_tag := '删除';
  end if;
  insert into SM_MOBILE_SOFTVERSION_LOG
  values(var_tag,sysdate);
end tri_SM_MOBILE_SOFTVERSION;
/

然后在触发对表SM_MOBILE_SOFTVERSION的操作的时候都会触发该监听器,并记录何种操作以及什么时候操作的。

<think>好的,我现在需要在Oracle存储过程中定义一个变量,并将其赋值为某记录数。我之前对存储过程有些了解,但具体如何操作还不太清楚,需要仔细想想。 首先,根据用户提供的引用资料,特别是引用[2],里面详细说明了变量的声明和赋值方法。变量类型包括NUMBER、%TYPE等,赋值可以通过SELECT INTO语句完成。比如例子中的SELECT * INTO V_COLUMN_SID FROM DFGZ_PKGMX WHERE id=2203。不过这里是要获取记录数,所以应该是COUNT(*),而不是具体的数据。 然后引用[4]中的例子,展示了如何用SELECT COUNT(id) INTO变量来赋值,比如DECLARE @recount INT; SELECT @recount=COUNT(id) FROM school。不过这里要注意Oracle的语法和SQL Server可能不同,比如在Oracle中变量声明是在DECLARE块,而赋值用SELECT INTO。 接下来,我需要确定正确的语法结构。在Oracle存储过程中,变量通常在DECLARE部分声明,然后使用SELECT INTO语句赋值。例如: DECLARE v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count FROM 名; END; 但用户的需求是在存储过程中,所以可能需要创建存储过程的框架。比如: CREATE OR REPLACE PROCEDURE get_record_count AS v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count FROM 名; -- 后续处理 END; 另外,引用[2]提到使用%ROWCOUNT来获取修改的记录数,但这里需要的是记录数,所以应该直接使用COUNT(*)。 还要注意异常处理,比如引用[2]中的NO_DATA_FOUND和TOO_MANY_ROWS异常,但在COUNT(*)的情况下,应该总是返回一行,所以可能不需要处理这些异常。不过为了严谨,可能还是需要处理可能的异常,但用户的问题可能不需要这么复杂。 另外,变量名的大小写问题,引用[2]提到变量不区分大小写,但建议保持一致性。 然后,根据用户的问题,是否要动态指定名?用户的问题中并没有提到动态名,所以可能直接使用固定的名。如果需要动态名,可能需要使用动态SQL,如引用[4]中的示例,使用EXECUTE IMMEDIATE或者sp_executesql,但Oracle中应该使用EXECUTE IMMEDIATE。 不过用户的问题可能只是简单的静态名,所以直接SELECT COUNT(*) INTO变量即可。 综合以上信息,正确的步骤应该是: 1. 在存储过程的DECLARE部分(或者在存储过程的BEGIN之前,如果是存储过程的话)声明一个NUMBER类型的变量。 2. 使用SELECT COUNT(*) INTO 变量 FROM 名; 来赋值。 3. 确保名正确,且用户有权限访问该。 4. 如果需要返回这个变量,可能使用OUT参数或者在存储过程中处理。 例如,完整的存储过程可能如下: CREATE OR REPLACE PROCEDURE get_table_count (p_count OUT NUMBER) AS BEGIN SELECT COUNT(*) INTO p_count FROM 名; END; 或者如果不需要参数,直接在存储过程中处理: CREATE OR REPLACE PROCEDURE count_records AS v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count FROM employees; DBMS_OUTPUT.PUT_LINE('记录数:' || v_count); END; 这样,当执行这个存储过程时,会计算employees记录数并输出。 还需要注意权限问题,确保存储过程有权限访问,以及DBMS_OUTPUT是否启用,以便看到输出。 总结,用户的问题需要声明变量并用SELECT INTO赋值,同时确保在存储过程的正确位置编写这些代码。</think>在Oracle存储过程中定义变量并赋值为记录数,可通过以下步骤实现: ### 步骤说明 1. **声明变量**:使用`NUMBER`类型或`名.字段名%TYPE`动态匹配类型[^2]。 2. **赋值操作**:通过`SELECT COUNT(*) INTO`语句将记录数赋值给变量。 3. **异常处理**(可选):处理`NO_DATA_FOUND`等异常。 ### 示例代码 ```sql CREATE OR REPLACE PROCEDURE get_record_count AS v_count NUMBER; -- 声明变量 BEGIN SELECT COUNT(*) INTO v_count FROM employees; -- 赋值记录数 DBMS_OUTPUT.PUT_LINE('记录数:' || v_count); -- 输出结果 EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('未找到数据'); END; / ``` ### 关键点 1. **变量类型选择**:若需动态匹配字段类型,可使用`v_count employees.employee_id%TYPE`[^2]。 2. **动态名赋值**:若需动态指定名,需使用`EXECUTE IMMEDIATE`: ```sql CREATE OR REPLACE PROCEDURE dynamic_count(p_table_name VARCHAR2) AS v_count NUMBER; v_sql VARCHAR2(200); BEGIN v_sql := 'SELECT COUNT(*) FROM ' || p_table_name; EXECUTE IMMEDIATE v_sql INTO v_count; DBMS_OUTPUT.PUT_LINE('记录数:' || v_count); END; / ``` 3. **输出结果**:通过`DBMS_OUTPUT`显示结果前需确保客户端支持输出(如SQL*Plus中执行`SET SERVEROUTPUT ON`)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值