我有三张表:
表一:
CREATE TABLE SMSC_MSGUPINTER
(
MSGID NUMBER DEFAULT 8 NOT NULL,
MSGCONTENT VARCHAR2(1000 BYTE) NOT NULL,
MOBILEPHONE VARCHAR2(13 BYTE),
RECEIVEDTIME DATE,
DESTNUMBER VARCHAR2(30 BYTE) DEFAULT (0),
EXNUMBER VARCHAR2(10 BYTE)
)表二:
CREATE TABLE SMS_MSGQUERYTYPE
(
QUERYTYPEID VARCHAR2(32 BYTE) NOT NULL,
QUERYNAME VARCHAR2(30 BYTE) NOT NULL,
QUERYCODE VARCHAR2(10 BYTE) NOT NULL,
DESCRIPTION VARCHAR2(300 BYTE),
ISEXECSQL NUMBER(1) DEFAULT (0) NOT NULL,
QUERYSQL CLOB,
STATE NUMBER(1) DEFAULT (1),
ORGID VARCHAR2(32 BYTE) NOT NULL
)表三:
CREATE TABLE SMSC_MSGDOWNINTER
(
MSGID NUMBER(8) NOT NULL,
MOBILEPHONE VARCHAR2(13 BYTE),
MSGCONTENT VARCHAR2(1000 BYTE),
FLAG NUMBER(2) DEFAULT 0,
SENDTIME DATE NOT NULL,
USERID VARCHAR2(50 BYTE),
ORGID VARCHAR2(50 BYTE),
APPCODE VARCHAR2(20 BYTE) NOT NULL,
EXNUMBER VARCHAR2(10 BYTE)
)现在要求:
当向表一中插入一条记录时,判断这条记录中的'EXNUMBER'字段值是否与表二中的QUERYCODE的字段值相等,
如果相等,就将表二中相等字段值的那条记录中的部分数据插入到表三中去;
如:将表二的'QUERYCODE','DESCRIPTION'和表一中的'MOBILEPHONE'的值分别插入表三中的'APPCODE','MSGCONTENT','MOBILEPHONE'里去;
我触发器不是很熟,特向高手请教;
表一:
CREATE TABLE SMSC_MSGUPINTER
(
MSGID NUMBER DEFAULT 8 NOT NULL,
MSGCONTENT VARCHAR2(1000 BYTE) NOT NULL,
MOBILEPHONE VARCHAR2(13 BYTE),
RECEIVEDTIME DATE,
DESTNUMBER VARCHAR2(30 BYTE) DEFAULT (0),
EXNUMBER VARCHAR2(10 BYTE)
)表二:
CREATE TABLE SMS_MSGQUERYTYPE
(
QUERYTYPEID VARCHAR2(32 BYTE) NOT NULL,
QUERYNAME VARCHAR2(30 BYTE) NOT NULL,
QUERYCODE VARCHAR2(10 BYTE) NOT NULL,
DESCRIPTION VARCHAR2(300 BYTE),
ISEXECSQL NUMBER(1) DEFAULT (0) NOT NULL,
QUERYSQL CLOB,
STATE NUMBER(1) DEFAULT (1),
ORGID VARCHAR2(32 BYTE) NOT NULL
)表三:
CREATE TABLE SMSC_MSGDOWNINTER
(
MSGID NUMBER(8) NOT NULL,
MOBILEPHONE VARCHAR2(13 BYTE),
MSGCONTENT VARCHAR2(1000 BYTE),
FLAG NUMBER(2) DEFAULT 0,
SENDTIME DATE NOT NULL,
USERID VARCHAR2(50 BYTE),
ORGID VARCHAR2(50 BYTE),
APPCODE VARCHAR2(20 BYTE) NOT NULL,
EXNUMBER VARCHAR2(10 BYTE)
)现在要求:
当向表一中插入一条记录时,判断这条记录中的'EXNUMBER'字段值是否与表二中的QUERYCODE的字段值相等,
如果相等,就将表二中相等字段值的那条记录中的部分数据插入到表三中去;
如:将表二的'QUERYCODE','DESCRIPTION'和表一中的'MOBILEPHONE'的值分别插入表三中的'APPCODE','MSGCONTENT','MOBILEPHONE'里去;
我触发器不是很熟,特向高手请教;
解决方案 »
- ORA-00600: internal error code, arguments [4194]错误 在线等,急。
- 求助!!各位大侠,帮忙看看查询速度好慢
- sql语句停止执行,不知原因
- 如何直接将select出来的多条记录放入RECORD多维数组里?
- 查询嵌套表问题,如何展开嵌套表内容?
- 在ORACLE数据库批量修改数据的问题
- 问一个简单的问题,sysman密码找不到了该怎么办?
- 介绍一些oracle的pl/sql的经典书籍
- Oracle8i数据库开机要重新打开的问题
- 在9i中,查询平均值,怎样才能限定得到的结果的小数位为两位数
- 需要递归的实例化视图的创建,请高手指点?
- 我是oracle新手,请教一下Oracle方面的问题
BEFORE UPDATE OR DELETE OR INSERT
ON SMSC_MSGUPINTER
FOR EACH ROW
IF INSERTING THEN
BEGIN
IF EXISTS(SELECT 1 FROM SMS_MSGQUERYTYPE WHERE QUERYCODE=:NEW.EXNUMBER)
BEGIN
INSERT INTO SMSC_MSGDOWNINTER(APPCODE,MSGCONTENT,MOBILEPHONE)
SELECT QUERYCODE,DESCRIPTION,NEW.MOBILEPHONE FROM SMS_MSGQUERYTYPE WHERE QUERYCODE=:NEW.EXNUMBER;
COMMIT;
END;
END IF;
END IF;
CREATE OR REPLACE TRIGGER TEST
BEFORE UPDATE OR DELETE OR INSERT
ON SMSC_MSGUPINTER
FOR EACH ROW
IF INSERTING THEN
BEGIN
IF EXISTS(SELECT 1 FROM SMS_MSGQUERYTYPE WHERE QUERYCODE=:NEW.EXNUMBER)
BEGIN
INSERT INTO SMSC_MSGDOWNINTER(APPCODE,MSGCONTENT,MOBILEPHONE)
SELECT QUERYCODE,DESCRIPTION,NEW.MOBILEPHONE FROM SMS_MSGQUERYTYPE WHERE QUERYCODE=:NEW.EXNUMBER;
COMMIT;
END;
END IF;
END IF;
我在IF INSERTING THEN上面加一句BEGIN就执行不报错了,
但触发时会报错,请问什么回事..
ORA-04098: 触发器 'JSTMIIUSER.SMSC_MSGUPINTER_INSERT' 无效且未通过重新验证
不明白哎..
又不好调试..
CREATE OR REPLACE TRIGGER TEST
BEFORE INSERT
ON SMSC_MSGUPINTER
FOR EACH ROW
declare
cnt number;
BEGIN
select count(*) into cnt from SMS_MSGQUERYTYPE
WHERE QUERYCODE=:NEW.EXNUMBER;
if cnt>0 then
INSERT INTO SMSC_MSGDOWNINTER(APPCODE,MSGCONTENT,MOBILEPHONE)
SELECT QUERYCODE,DESCRIPTION,NEW.MOBILEPHONE
FROM SMS_MSGQUERYTYPE
WHERE QUERYCODE=:NEW.EXNUMBER;
COMMIT;
end if;
END;
/
把:
INSERT INTO SMSC_MSGDOWNINTER(APPCODE,MSGCONTENT,MOBILEPHONE)
SELECT QUERYCODE,DESCRIPTION,NEW.MOBILEPHONE
FROM SMS_MSGQUERYTYPE
WHERE QUERYCODE=:NEW.EXNUMBER;
COMMIT;
end if;
改为:
INSERT INTO SMSC_MSGDOWNINTER(APPCODE,MSGCONTENT,MOBILEPHONE)
SELECT QUERYCODE,DESCRIPTION,:NEW.MOBILEPHONE
FROM SMS_MSGQUERYTYPE
WHERE QUERYCODE=:NEW.EXNUMBER;
end if;
这样其实还是会报错,因为你的第三个表建表时MSGID字段和其他几个字段都要求not null,但是你又在触发器中要求:
“就将表二中相等字段值的那条记录中的部分数据插入到表三中去;
如:将表二的'QUERYCODE','DESCRIPTION'和表一中的'MOBILEPHONE'的值分别插入表三中的'APPCODE','MSGCONTENT','MOBILEPHONE'里去; ”
你没说MSGID等几个字段在触发器触发新插入时如何处理。
这几个字段该插入什么值?又不能为空。
BEFORE INSERT
ON SMSC_MSGUPINTER
FOR EACH ROW
declare
cnt number;
BEGIN
select count(*) into cnt from SMS_MSGQUERYTYPE
WHERE QUERYCODE=:NEW.EXNUMBER;
if cnt>0 then
INSERT INTO SMSC_MSGDOWNINTER(APPCODE,MSGCONTENT,MOBILEPHONE)
SELECT QUERYCODE,DESCRIPTION,:NEW.MOBILEPHONE
FROM SMS_MSGQUERYTYPE
WHERE QUERYCODE=:NEW.EXNUMBER;
end if;
END;数五,它报错是end if; 这地方错,是不是语法错?
错误为:
Error: PLS-00103: 出现符号 "IF"在需要下列之一时:
; <an identifier>
<a double-quoted delimited-identifier>
Line: 15
Text: END IF;