Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Kursor w procedurze zwraca więcej wartości niż zapytanie

Masz konflikt nazw. Nazwałeś swoje zmienne lokalne tak samo jak nazwy kolumn, a nazwy kolumn mają pierwszeństwo, jak wspomniano w dokumentacji:

Jeśli instrukcja SQL odwołuje się do nazwy, która należy zarówno do kolumny, jak i do zmiennej lokalnej lub parametru formalnego, wówczas pierwszeństwo ma nazwa kolumny.

Uwaga:
Gdy nazwa zmiennej lub parametru jest interpretowana jako nazwa kolumny, dane mogą zostać przypadkowo usunięte, zmienione lub wstawione.

Pierwsze cztery sprawdzenia zawsze będą prawdziwe (chyba że masz wartości null), więc otrzymasz każdy wiersz, który ma done = 'N' .

Zmień nazwy zmiennych lokalnych na inne; dość często używa się prefiksu do rozróżniania lokalnych zmiennych, parametrów i kolumn, coś takiego:

Cursor linija IS 
SELECT *
FROM table_x X
where x.mjt = l_mjt
and   x.salesman = l_salesman
and x.kind = l_kind
and x.kolo1 = l_kolo1
and x.done = 'N';

Jeśli jest to procedura składowana, a nie anonimowy blok, możesz użyć nazwy procedury/funkcji jako prefiksu, co niektórzy wolą. Jeśli twoja procedura nazywała się myproc , na przykład możesz zrobić:

Cursor linija IS 
SELECT *
FROM table_x X
where x.mjt = myproc.mjt
and   x.salesman = myproc.salesman
and x.kind = myproc.kind
and x.kolo1 = myproc.kolo1
and x.done = 'N';


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak odświeżyć zmaterializowany widok w Oracle?

  2. ORA-22905 - podczas zapytania o typ tabeli za pomocą instrukcji SELECT

  3. Wszystkie przydatne dynamiczne widoki wydajności 11g

  4. Jak podłączyć bazę danych Oracle z PHP

  5. Jak tworzyć procedury składowane PL/SQL z parametrami w bazie danych Oracle