PL / SQL和SQL%ROWCOUNT错误

时间:2012-11-19 15:20:59

标签: sql oracle plsql

我正在尝试创建PL / SQL过程。但它没有正常工作。请查看代码并就此提出建议。

CREATE OR REPLACE PROCEDURE TEST IS

DECLARE
EMPLOYEENUM EMPLOYEE.E#%type;
EMPLOYEENAME EMPLOYEE.NAME%type;
NUMRECORDS NUMBER(2);

BEGIN

SELECT EMP.E# INTO EMPLOYEENUM ,EMP.NAME INTO EMPLOYEENAME
FROM EMPLOYEE EMP
WHERE EXISTS
(SELECT * FROM MECHANIC, DRIVER
WHERE EMP.E# = DRIVER.E# 
AND EMP.E# = MECHANIC.E#);

SELECT COUNT(*) INTO NUMRECORDS
FROM (
SELECT EMP.E#,EMP.NAME
FROM EMPLOYEE EMP
WHERE EXISTS
(SELECT * FROM MECHANIC, DRIVER
 WHERE EMP.E# = DRIVER.E# 
 AND EMP.E# = MECHANIC.E#));

IF (NUMRECORDS > 0) THEN
    DBMS_OUTPUT.PUT_LINE('ERROR: CANNOT MAKE MORE THEN 2 TRIPS PER DAY');
    ROLLBACK;
ELSE
    COMMIT;
END IF;
EXCEPTION
WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
    ROLLBACK;
END VERIFY;

我确信我不需要再次运行代码来查看行数。我知道有一些叫做

的东西

SQL%ROWCOUNT

返回行数。请告知如何使用它。

2 个答案:

答案 0 :(得分:1)

您可以使用IDE并进行编译以查看其失败的位置。如果你试图在SQLPLUS中编译它,你只看到"编译错误"消息,键入显示错误,您将看到错误。我仍然会推荐像sql developer这样的IDE。

以下是我可以看到的一些问题......

  1. 声明关键字:创建过程或函数时不需要
  2. 您的创建过程名称为" TEST"你的结局已经过了#34; VERIFY"
  3. SELECT EMP.E# INTO EMPLOYEENUM ,EMP.NAME INTO EMPLOYEENAME:您应首先列出所有列,然后列出变量名称。它应该是SELECT EMP.E#,EMP.NAME INTO EMPLOYEENUM, EMPLOYEENAME
  4. 不确定你提交了什么,因为这里没有DML,但如果你的计划是从触发器调用这个过程,如果插入到Mechanic或Driver中,你可能会遇到变异表错误。
  5. 更多背景信息和更多错误信息将非常有用。

答案 1 :(得分:0)

有一些问题......

  1. 在过程或函数中不必使用DECLARE关键字。
  2. 程序名称以“TEST”开头,结束为“VERIFY”
  3. 您使用“SELECT EMP.E#INTO EMPLOYEENUM,EMP.NAME INTO EMPLOYEENAME”,您应首先使用所有列,然后使用变量名称。它应该是SELECT EMP.E#,EMP.NAME INTO EMPLOYEENUM,EMPLOYEENAME
  4. 你没有在程序之间使用任何DML而你正在使用ROLLBACK,它没有用。
  5. 如果您可以提供“机械师”和“驱动程序”的表格结构,那么我可以向您发送可能对您有用的代码。

    感谢。