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

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
    点赞 打赏 评论
  • lggegegmail 2009-09-25 17:57

    [1] 改错
    :OLD_SERVICE := select SERVICENAME from SERVICE WHERE USER_ID = :USER_AFTER_UPDATED.USER_ID;

    改成:

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

    [2] 改错
    定义的变量前面不需要加:的, 当然:USER_BEFORE_UPDATED.CURRENT_MODE 这个前面是需要:的

    [3] 其他
    SERVICE_NAME VARCHAR2(20);

    SERVICE_NAME := 'TERMINATE';

    可以直接写成 SERVICE_NAME VARCHAR2(20) := 'TERMINATE';

    点赞 打赏 评论

相关推荐 更多相似问题