SQLPLUS возвращает только 1 и 0 чисел, используя dbms_output.put_line

http://shrani.si/f/S/52/2l8ZPmn7/stack.jpg

У меня проблема в отношении M:1. У меня есть сущность с именем "Запослени" (M) и сущность с именем "Запори" (1). Проблема появляется, когда я хочу выполнить свою процедуру. Ошибка говорит о том, что мой родительский ключ не был найден, хотя я заполнил свою запорную сущность 20 примерами. Когда я использую "dbms_output.put_line", чтобы увидеть, какая процедура возвращает (перед оператором INSERT), процедура возвращает только 1 и 0, иногда 2 или 4. Я знаю, что процедура должна возвращать числа от 1 до 20.

SQL выглядит так: http://shrani.si/f/45/Nt/ig2Gi8t/stack2.jpg

Теперь мне нужно знать, почему это происходит, и я был бы благодарен, если бы кто-то мог решить эту проблему или хотя бы помочь мне с некоторыми советами.

Код SQL:

CREATE OR REPLACE PACKAGE BODY ui AS    
PROCEDURE polni_zaposleni(stevilo_zaposleni NUMBER) IS

    id_za NUMBER(10);   

    ime VARCHAR2(20);
    priimek VARCHAR2(20);
    del_doba VARCHAR2(20);
    id_z NUMBER(10);
    id_z_count number:= 0;

BEGIN
    select count(1)
    into id_z_count
    from zaporniki;

        FOR st IN 1..stevilo_zaposleni LOOP

            id_z := dbms_random.value(1, id_z_count);

            ime := 'Ime';
            priimek := 'Priimek';
            del_doba := 'Del_doba';

            ime := ime||' '|| TO_CHAR(st);
            priimek := priimek ||' '|| TO_CHAR(st);
            del_doba := del_doba ||' '|| TO_CHAR(st);

            dbms_output.put_line(id_z);

            --INSERT INTO ZAPOSLENI (ID_ZA, IME, PRIIMEK, DEL_DOBA, ID_Z)
            --VALUES (st, ime, priimek, del_doba, id_z);

            --dbms_output.put_line(st);


        END LOOP;
END;    

END UI;

1 ответ

Похоже, что работает нормально на SQL Fiddle.

Настройка схемы Oracle 11g R2:

CREATE TABLE zaporniki ( a ) AS
SELECT LEVEL
FROM   DUAL
CONNECT BY LEVEL <=20
/

CREATE TABLE ZAPOSLENI (
  ID_ZA    NUMBER,
  IME      VARCHAR2(20),
  PRIIMEK  VARCHAR2(20),
  DEL_DOBA VARCHAR2(20),
  ID_Z     NUMBER
)
/

CREATE OR REPLACE PACKAGE ui
AS
  PROCEDURE polni_zaposleni(stevilo_zaposleni NUMBER);
END ui;
/

CREATE OR REPLACE PACKAGE BODY ui AS

PROCEDURE polni_zaposleni(stevilo_zaposleni NUMBER)
IS
    id_za      NUMBER(10);   
    ime        CONSTANT VARCHAR2(20) := 'Ime';
    priimek    CONSTANT VARCHAR2(20) := 'Priimek';
    del_doba   CONSTANT VARCHAR2(20) := 'Del_doba';
    id_z       NUMBER(10);
    id_z_count NUMBER;
BEGIN
  select count(1)
  into id_z_count
  from zaporniki;

  FOR st IN 1..stevilo_zaposleni LOOP
    id_z := dbms_random.value(1, id_z_count);

    dbms_output.put_line(id_z);

    INSERT INTO ZAPOSLENI (ID_ZA, IME, PRIIMEK, DEL_DOBA, ID_Z)
    VALUES (
      st,
      ime||' '|| TO_CHAR(st),
      priimek ||' '|| TO_CHAR(st),
      del_doba ||' '|| TO_CHAR(st),
      id_z
    );

    --dbms_output.put_line(st); 
  END LOOP;
END;    

END ui;
/

Запрос 1:

SELECT * FROM zaporniki

Результаты:

|  A |
|----|
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
| 16 |
| 17 |
| 18 |
| 19 |
| 20 |

Запрос 2:

BEGIN
  ui.polni_zaposleni(10);
END;

Результаты:

Запрос 3:

SELECT * FROM ZAPOSLENI

Результаты:

| ID_ZA |    IME |    PRIIMEK |    DEL_DOBA | ID_Z |
|-------|--------|------------|-------------|------|
|     1 |  Ime 1 |  Priimek 1 |  Del_doba 1 |    8 |
|     2 |  Ime 2 |  Priimek 2 |  Del_doba 2 |   16 |
|     3 |  Ime 3 |  Priimek 3 |  Del_doba 3 |    7 |
|     4 |  Ime 4 |  Priimek 4 |  Del_doba 4 |   20 |
|     5 |  Ime 5 |  Priimek 5 |  Del_doba 5 |   11 |
|     6 |  Ime 6 |  Priimek 6 |  Del_doba 6 |   11 |
|     7 |  Ime 7 |  Priimek 7 |  Del_doba 7 |   12 |
|     8 |  Ime 8 |  Priimek 8 |  Del_doba 8 |    8 |
|     9 |  Ime 9 |  Priimek 9 |  Del_doba 9 |   20 |
|    10 | Ime 10 | Priimek 10 | Del_doba 10 |    2 |
Другие вопросы по тегам