2017-04-09 9 views
0

タイプを使用してメールテーブルにデータを格納するストアドプロシージャを作成しようとしています。別のテーブルのフィールドを参照する必要があるストアドプロシージャを挿入します

24/1 PL/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; 
/

答えて

0

あなたの挿入は、あなたの手順の24行で、列リストと値句で、DATE_DELIVEREDを指します。プロシージャの宣言とテーブルの作成にはDATE_DELIEVEDがあります。あなたはその変数と列名を一貫して綴る必要があります。

挿入が解析されるとき、使用する名前/スペルの範囲に変数やパラメータなどはありません。したがって、パーサーの並べ替えは、あなたが列名を参照することを意味していなければならないと仮定していますその点。したがって、特定のエラーが発生する - それは、特定のものを選んだ方法がすぐに分かりませんが...

ちなみに、一般的に(一般的ではありませんが)データベースオブジェクトには、 - とパラメータとローカル変数名の間の混乱を避けるためです。正式な引数にはp_という接頭辞が付き、ローカル変数にはl_という接頭辞が付いていることがよくありますが、どのようなものであれ一貫性があり、コーディング標準の一部でなければなりません。

関連する問題