sql >> Databáze >  >> RDS >> Oracle

PL/SQL ORA-01422:Přesné načtení vrátí více než požadovaný počet řádků

A SELECT INTO příkaz vyvolá chybu, pokud vrátí něco jiného než 1 řádek. Pokud vrátí 0 řádků, dostanete no_data_found výjimka. Pokud vrátí více než 1 řádek, dostanete too_many_rows výjimka. Pokud nevíte, že vždy bude přesně 1 zaměstnanec s platem vyšším než 3000, nechcete SELECT INTO prohlášení zde.

S největší pravděpodobností chcete použít kurzor k iteraci přes (potenciálně) více řádků dat (předpokládám také, že jste zamýšleli provést správné spojení mezi dvěma tabulkami spíše než provést kartézský součin, takže předpokládám, že je departmentID sloupec v obou tabulkách)

BEGIN
  FOR rec IN (SELECT EMPLOYEE.EMPID, 
                     EMPLOYEE.ENAME, 
                     EMPLOYEE.DESIGNATION, 
                     EMPLOYEE.SALARY,  
                     DEPARTMENT.DEPT_NAME 
                FROM EMPLOYEE, 
                     DEPARTMENT 
               WHERE employee.departmentID = department.departmentID
                 AND EMPLOYEE.SALARY > 3000)
  LOOP
    DBMS_OUTPUT.PUT_LINE ('Employee Nnumber: ' || rec.EMPID);
    DBMS_OUTPUT.PUT_LINE ('---------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE ('Employee Name: ' || rec.ENAME);
    DBMS_OUTPUT.PUT_LINE ('---------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE ('Employee Designation: ' || rec.DESIGNATION);
    DBMS_OUTPUT.PUT_LINE ('----------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE ('Employee Salary: ' || rec.SALARY);
    DBMS_OUTPUT.PUT_LINE ('----------------------------------------------------');
    DBMS_OUTPUT.PUT_LINE ('Employee Department: ' || rec.DEPT_NAME);
  END LOOP;
END;

Předpokládám, že se také teprve učíte PL/SQL. Ve skutečném kódu byste nikdy nepoužili dbms_output takto a nezávisí na tom, že někdo uvidí data, která zapíšete do dbms_output vyrovnávací paměti.



  1. MySQL :transakce v rámci uložené procedury

  2. Jak obnovit heslo správce WordPress pomocí příkazového řádku MySQL

  3. Kde jsou protokoly PostgreSQL na macOS?

  4. Převod se nezdařil při převodu data a/nebo času ze znakového řetězce při vkládání datetime