Oracle11g 插入需要引用另一个表中字段的存储过程

Oracle11g 插入需要引用另一个表中字段的存储过程,oracle11g,Oracle11g,我试图创建一个存储过程,使用type和costperlb引用邮件类型表来填充邮件表,以计算传递成本 我不断地得到is:24/1pl/SQL:SQL语句被忽略 25/50 PL/SQL:ORA-00984:此处不允许使用列。 一段时间以来,我一直在努力解决这个问题;我只剩下几个小时了。任何帮助都将不胜感激 CREATE TABLE MAILTYPE( TYPEID NUMBER PRIMARY KEY, NAME VARCHAR2(30) NOT NULL, COSTPERLB DECIMAL

我试图创建一个存储过程,使用type和costperlb引用邮件类型表来填充邮件表,以计算传递成本

我不断地得到is:24/1pl/SQL:SQL语句被忽略 25/50 PL/SQL:ORA-00984:此处不允许使用列。 一段时间以来,我一直在努力解决这个问题;我只剩下几个小时了。任何帮助都将不胜感激

CREATE TABLE MAILTYPE(
TYPEID NUMBER PRIMARY KEY,
NAME VARCHAR2(30)  NOT NULL,
COSTPERLB DECIMAL NOT NULL
);




CREATE TABLE MAIL (
 ID NUMBER PRIMARY KEY,
 STATUS VARCHAR2(30) NOT NULL,
 DATE_RECEIVED DATE NOT NULL,
 DATE_DELIEVED DATE NOT NULL,
 CUSTID NUMBER,
 TYPEID NUMBER,
 RECIPIENTID NUMBER,
 WEIGHT DECIMAL,
 COST DECIMAL
CONTRAINT...
 );



CREATE OR REPLACE PROCEDURE INSERT_MAIL
(
 ID NUMBER,
 STATUS VARCHAR2,
 DATE_RECEIVED DATE,
 DATE_DELIEVED DATE,
 CUSTID NUMBER,
 TYPEID NUMBER,
 RECIPIENTID NUMBER,
 WEIGHT DECIMAL,
 COST DECIMAL
)

AS

M_TOTAL  DECIMAL;
COST_PER DECIMAL;

BEGIN

IF (to_char(SYSDATE,'DY') IN ('MON', 'TUE', 'WED', 'THU', 'FRI')) AND (TO_CHAR(SYSDATE,'HH24') IN ('9','10','11','12','13','14','15','16','17'))
THEN

INSERT INTO MAIL (ID,STATUS,DATE_RECEIVED,DATE_DELIVERED,CUSTID,TYPEID,RECIPIENTID,WEIGHT, cost)
VALUES(CUSTOMER_SEQ.nextval,STATUS,DATE_RECEIVED,DATE_DELIVERED,CUSTID,TYPEID,RECIPIENTID,WEIGHT,cost);


IF (TYPEID = 1) THEN 

SELECT COSTPERLB INTO COST_PER FROM SEANTEE_DA.MAILTYPE
WHERE SEANTEE_DA.MAILTYPE.TYPEID = 1;
 M_TOTAL := COST_PER * WEIGHT;
UPDATE MAIL SET COST = M_TOTAL
WHERE TYPEID = 1;

end if;

IF (TYPEID = 2) THEN 

 SELECT COSTPERLB INTO COST_PER FROM SEANTEE_DA.MAILTYPE 
 WHERE MAILTYPE.TYPEID = 2;
M_TOTAL := COST_PER * WEIGHT;
UPDATE MAIL SET COST = M_TOTAL
WHERE TYPEID = 2;

END IF;
IF (TYPEID = 3) THEN 

 SELECT COSTPERLB INTO COST_PER FROM SEANTEE_DA.MAILTYPE 

 WHERE SEANTEE_DA.MAILTYPE.TYPEID = 3 ;

 M_TOTAL := COST_PER * WEIGHT;

UPDATE MAIL SET COST = M_TOTAL
WHERE TYPEID = 3;

END IF;

END IF;

COMMIT;

END;
/

您在程序的第24行插入的内容是指列列表和values子句中的
DATE\u DELIVERED
。在您的过程声明和表创建中,您有
DATE\u delived
。您必须始终如一地拼写该变量和列名

解析insert时,在使用名称/拼写的范围内没有变量或参数等,因此解析器会假定您一定是想引用列名,这在当时是不允许的。因此,你会得到一个特定的错误——尽管有时它是如何选择那个特定的错误的并不明显

顺便说一句,通常(尽管不是普遍)认为最好对数据库对象使用不同的名称(包括列名)以及参数和局部变量名,以避免两者之间的混淆。通常形式参数的前缀是
p_
,局部变量的前缀是
l_
,但无论您做什么,都应该是一致的,并且是编码标准的一部分