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と入力すると、エラーが表示されます。ただし、SQLDeveloperのような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にあると、ミューティングテーブルエラーが発生する可能性があります。

より多くの背景とより多くのエラー情報が役立つでしょう。

于 2012-11-19T15:42:10.553 に答える
0

いくつかの問題があります...

  1. DECLAREキーワードは、プロシージャまたは関数で使用する必要はありません。
  2. プロシージャ名は「TEST」で始まり、「VERIFY」で終わります。
  3. 「SELECTEMP.E#INTO EMPLOYEENUM、EMP.NAME INTO EMPLOYEENAME」を使用しました。最初にすべての列を使用し、次に変数名を使用する必要があります。SELECT EMP.E#、EMP.NAME INTO EMPLOYEENUM、EMPLOYEENAMEである必要があります
  4. 手順の間にDMLを使用せず、ROLLBACKを使用していますが、使用できません。

「メカニック」と「ドライバー」のテーブル構造を提供していただければ、役立つコードをお送りします。

ありがとう。

于 2012-11-29T20:42:14.493 に答える