一個PL/SQL的簡單問題,老是出錯(100分)

  • 主题发起人 主题发起人 luyear
  • 开始时间 开始时间
L

luyear

Unregistered / Unconfirmed
GUEST, unregistred user!
寫了如下一個過程,用來更新兩個表的數據,老是出錯,又看不到出錯信息
我的Oracle是8.1.7,過程如下
(MY_ODR_NO IN VARCHAR2,
MY_SEC_NO IN VARCHAR2,
MY_LAST_W1 IN VARCHAR2,
MY_LAST_W2 IN VARCHAR2,
MY_LAST_W3 IN VARCHAR2,
MY_LAST_W4 IN VARCHAR2,
MY_LAST_W5 IN VARCHAR2)
AS
ODR ORDER_ODRM.ODR_NO%TYPE;
PAR PRE_PART.PART_NO%TYPE;--10
v_MAS VARCHAR2(9);
MAS VARCHAR2(1);
CURSOR c_JC IS SELECT A.ODR_NO,B.PART_NO,B.MAT_NO FROM ORDER_ODRM A,ORDER_BOMD B WHERE A.ODR_NO=MY_ODR_NO AND A.ARTIC_NO=B.ARTIC_NO;
Begin
OPEN c_JC;
LOOP
FETCH c_JC INTO ODR,PAR,v_MAS;
IF SUBSTR(v_MAS,1,1)='A' THEN
MAS:='T';--20
ELSE
MAS:='F';
END IF
INSERT INTO PRE_PART (ODR_NO,PART_NO,MAS_PRE) Values (ODR,PAR,MAS);
INSERT INTO PRE_ODRM (ODR_NO,PART_NO,SEC,LAST_W,QTY,"MASTER",PDATE) Values (ODR,PAR,MY_SEC_NO,MY_LAST_W1,0,MAS,SYSDATE);
IF MY_LAST_W2<>'' THEN
INSERT INTO PRE_ODRM (ODR_NO,PART_NO,SEC,LAST_W,QTY,"MASTER",PDATE) Values (ODR,PAR,MY_SEC_NO,MY_LAST_W2,0,MAS,SYSDATE);
END IF;
IF MY_LAST_W3<>'' THEN
INSERT INTO PRE_ODRM (ODR_NO,PART_NO,SEC,LAST_W,QTY,"MASTER",PDATE) Values (ODR,PAR,MY_SEC_NO,MY_LAST_W3,0,MAS,SYSDATE);--30
END IF;
IF MY_LAST_W4<>'' THEN
INSERT INTO PRE_ODRM (ODR_NO,PART_NO,SEC,LAST_W,QTY,"MASTER",PDATE) Values (ODR,PAR,MY_SEC_NO,MY_LAST_W4,0,MAS,SYSDATE);
END IF;
IF MY_LAST_W5<>'' THEN
INSERT INTO PRE_ODRM (ODR_NO,PART_NO,SEC,LAST_W,QTY,"MASTER",PDATE) Values (ODR,PAR,MY_SEC_NO,MY_LAST_W5,0,MAS,SYSDATE);
END IF;
END LOOP;
CLOSE c_JC;
COMMIT;
End PRE_PART_INSERT;
 
錯誤出在
<1>"應是'
<2>end if沒有;
<3>exit when row%notfound 沒有加
<4>oracle 817的pl/sql出錯信息,在不同版本的oracle pl/slq的編輯器中看不到,
換個版本看看出錯信息
<5>判段空值的方式是:
IF NVL(v_CLASS,'NULL')='NULL' Then
不能直接用<>''來判斷

(MY_ODR_NO IN VARCHAR2,
MY_SEC_NO IN VARCHAR2,
MY_LAST_W1 IN VARCHAR2,
MY_LAST_W2 IN VARCHAR2,
MY_LAST_W3 IN VARCHAR2,
MY_LAST_W4 IN VARCHAR2,
MY_LAST_W5 IN VARCHAR2)
AS
ODR ORDER_ODRM.ODR_NO%TYPE;
PAR PRE_PART.PART_NO%TYPE;--10
v_MAS VARCHAR2(9);
MAS VARCHAR2(1);
CURSOR c_JC IS SELECT A.ODR_NO,B.PART_NO,B.MAT_NO FROM ORDER_ODRM A,ORDER_BOMD B WHERE A.ODR_NO=MY_ODR_NO AND A.ARTIC_NO=B.ARTIC_NO;
Begin
OPEN c_JC;
LOOP
FETCH c_JC INTO ODR,PAR,v_MAS;
EXIT WHEN c_JC%NOTFOUND;
IF SUBSTR(v_MAS,1,1)='A' THEN
MAS:='T';--20
ELSE
MAS:='F';
END IF;
INSERT INTO PRE_PART (ODR_NO,PART_NO,MAS_PRE) Values (ODR,PAR,MAS);
INSERT INTO PRE_ODRM (ODR_NO,PART_NO,SEC,LAST_W,QTY,"MASTER",PDATE) Values (ODR,PAR,MY_SEC_NO,MY_LAST_W1,0,MAS,SYSDATE);
IF MY_LAST_W2<>'' THEN
INSERT INTO PRE_ODRM (ODR_NO,PART_NO,SEC,LAST_W,QTY,"MASTER",PDATE) Values (ODR,PAR,MY_SEC_NO,MY_LAST_W2,0,MAS,SYSDATE);
END IF;
IF MY_LAST_W3<>'' THEN
INSERT INTO PRE_ODRM (ODR_NO,PART_NO,SEC,LAST_W,QTY,"MASTER",PDATE) Values (ODR,PAR,MY_SEC_NO,MY_LAST_W3,0,MAS,SYSDATE);--30
END IF;
IF MY_LAST_W4<>'' THEN
INSERT INTO PRE_ODRM (ODR_NO,PART_NO,SEC,LAST_W,QTY,"MASTER",PDATE) Values (ODR,PAR,MY_SEC_NO,MY_LAST_W4,0,MAS,SYSDATE);
END IF;
IF MY_LAST_W5<>'' THEN
INSERT INTO PRE_ODRM (ODR_NO,PART_NO,SEC,LAST_W,QTY,"MASTER",PDATE) Values (ODR,PAR,MY_SEC_NO,MY_LAST_W5,0,MAS,SYSDATE);
END IF;
END LOOP;
CLOSE c_JC;
COMMIT;
End PRE_PART_INSERT;
 
不愧是高手,厲害!!!
 
接受答案了.
 
后退
顶部