DECLARE
acct_balance NUMBER(11, 2);
acct_num VARCHAR2(10);
trans_amt NUMBER(11, 2);
oper CHAR(1);
more_than_balance EXCEPTION;
PRAGMA EXCEPTION_INIT (more_than_balance, -00054);
BEGIN
acct_num := &acct_num;
trans_amt := &trans_amt;
oper := &oper;
SELECT curbal
INTO acct_balance
FROM acct_mstr
WHERE acct_no = acct_num;
IF oper = 'D' THEN
IF trans_amt < acct_balance THEN
UPDATE acct_mstr
SET curbal = curbal - trans_amt
WHERE acct_no = acct_num;
ELSE
RAISE more_than_balance;
END IF;
ELSIF oper = 'C' THEN
UPDATE acct_mstr
SET curbal = curbal + trans_amt
WHERE acct_no = acct_num;
END IF;
EXCEPTION
WHEN more_than_balance THEN
dbms_output.Put_line('attempted to withdraw more than the current balance ' || acct_balance ||'from the account numebr' ||acct_num);
END;
获取
ORA-06550: line 9, column 17:
PLS-00201: identifier 'D' must be declared
ORA-06550: line 9, column 5:
PL/SQL: Statement ignored
ORA-06550: line 10, column 18:
PLS-00201: identifier 'C' must be declared
答案 0 :(得分:1)
acct_num和oper是varchar / char字段,它应该是单引号...如下所示
acct_num := '&acct_num';
oper := '&oper';
答案 1 :(得分:0)
删除oper := &oper;
并在你的if条件下试试这个:
IF &oper := 'D' THEN
同样
ELSIF &oper := 'C' THEN
所以你的查询就像:
DECLARE
acct_balance NUMBER(11, 2);
acct_num VARCHAR2(10);
trans_amt NUMBER(11, 2);
oper CHAR(1);
more_than_balance EXCEPTION;
PRAGMA EXCEPTION_INIT (more_than_balance, -00054);
BEGIN
acct_num := &acct_num;
trans_amt := &trans_amt;
SELECT curbal
INTO acct_balance
FROM acct_mstr
WHERE acct_no = acct_num;
IF &oper := 'D' THEN
IF trans_amt < acct_balance THEN
UPDATE acct_mstr
SET curbal = curbal - trans_amt
WHERE acct_no = acct_num;
ELSE
RAISE more_than_balance;
END IF;
ELSIF &oper := 'C' THEN
UPDATE acct_mstr
SET curbal = curbal + trans_amt
WHERE acct_no = acct_num;
END IF;
EXCEPTION
WHEN more_than_balance THEN
dbms_output.Put_line('attempted to withdraw more than the current balance ' || acct_balance ||'from the account numebr' ||acct_num);
END;