iteye_15325 2009-09-25 15:52
浏览 842
已采纳

oracle触发器语句找错(变量定义,赋值,条件判断)

[code="sql"]
CREATE OR REPLACE TRIGGER "d"

AFTER UPDATE ON "USER"

REFERENCING OLD AS "USER_BEFORE_UPDATED" NEW AS "USER_AFTER_UPDATED"

FOR EACH ROW

DECLARE
OLD_SERVICE VARCHAR2(20);
TIME_D NUMBER;
SERVICE_NAME VARCHAR2(20);
SERVICE_NAME := 'TERMINATE';

BEGIN

--user表的CURRENT_MODE字段被更新为TERMINATE
IF :USER_BEFORE_UPDATED.CURRENT_MODE <> :SERVICE_NAME and :USER_AFTER_UPDATED.CURRENT_MODE = :SERVICE_NAME THEN

--查询user的service名字

:OLD_SERVICE := select SERVICENAME from SERVICE WHERE USER_ID = :USER_AFTER_UPDATED.USER_ID;

--计算当前时间的long型值
:TIME_D := select (sysdate - 8 / 24 - to_date('1970-01-01', 'yyyy-mm-dd')) * 86400000 from dual;

--根据以上数据插入info表一条记录
INSERT INTO INFO VALUES ( :TIME_D,:OLD_SERVICE,'N',:USER_AFTER_UPDATED.USER_NAME);
END IF;

END;
[/code]
[size=medium]本意是:当更新user表的时候,触发事件:当user表的CURRENT_MODE字段被更新为TERMINATE时,执行code,首先查询user的service,计算当前时间的long型值,根据以上数据插入info表一条记录。

这里有一些错误,大家就当是看伪代码,请大家纠错! :D 

这里涉及到的问题有:
1 触发器中如何定义一个变量,然后给他赋一个varchar2的值?
2 如何将sql的查询结果赋值给变量
3 如何在代码块中使用变量

另外希望大家讨论讨论oracle调试命令的好工具[/size]

  • 写回答

2条回答

  • lggegegmail 2009-09-25 17:44
    关注

    1 定义一个变量:
    DECLARE
    SERVICE_NAME VARCHAR2(20);

    2 赋值
    直接赋值 SERVICE_NAME := '123'
    查询赋值 SELETE NAME INTO SERVICE_NAME FROM A

    3 代码块中用变量是不可以的, 也必须写在DECLARE下面

    1. 调试工具: PLSQL 或 TOAD
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3