1

我正在尝试创建一个 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

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

4

2 回答 2

1

您可以使用 IDE 并进行编译以查看失败的地方。如果您尝试在 SQLPLUS 中编译它并且您只看到“Compiled with errors”消息,请键入SHOW ERRORS,您将看到错误。不过,我仍然会推荐像 sql developer 这样的 IDE。

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

  1. 声明关键字:创建过程或函数时不需要
  2. 您的创建程序名称为“TEST”,您的程序名称为“VERIFY”
  3. SELECT EMP.E# INTO EMPLOYEENUM ,EMP.NAME INTO EMPLOYEENAME:您应该首先列出所有列,然后列出变量名称。它应该是SELECT EMP.E#,EMP.NAME INTO EMPLOYEENUM, EMPLOYEENAME
  4. 不确定您要提交什么,因为这里没有 DML,但是如果您的计划是从触发器调用此过程,如果插入到 Mechanic 或 Driver 中,您可能会遇到 mutating table 错误。

更多背景和更多错误信息将很有用。

于 2012-11-19T15:42:10.553 回答
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,它没有用。

如果你能提供“ Mechanic ”和“ Driver ”的表结构,那么我可以把代码发给你,对你有帮助。

谢谢。

于 2012-11-29T20:42:14.493 回答