2015-11-19 9 views
0

Это мой код Проблема заключается в том, что он не добавляет hourswk вместе, чтобы правильно делать вывод для сотрудников без оклада тем, у кого есть H. Часы columnn в allinfo1 должны быть 45, 61 , 40, 43, 40, 44, 45, 40, но он отображает только один из часов и не добавляет их.PL/SQL, головной скребок

SET SERVEROUTPUT ON 
DECLARE 
    v_idno  paydata4.idno%TYPE; 
    v_name  paydata4.name%TYPE; 
    v_sal  paydata4.salary%TYPE; 
    v_job  paydata4.jobcode%TYPE; 
    v_pay  paydata4.payhr%TYPE; 
    v_idno1  paytran1.idno%TYPE; 
    v_hourswk paytran1.hourswk%TYPE; 
    v_hours  allinfo1.hours%TYPE; 
    CURSOR paydata4_cursor IS 
    SELECT idno, name, salary, jobcode, payhr FROM paydata4 
    ORDER BY idno; 
CURSOR paytran1_cursor IS 
    SELECT idno, hourswk FROM paytran1 
    WHERE v_idno = idno 
    order by idno; 
    BEGIN 
    OPEN paydata4_cursor; 
    LOOP 
    FETCH paydata4_cursor INTO v_idno, v_name, v_sal, v_job, v_pay; 
    EXIT WHEN paydata4_cursor%NOTFOUND; 
     IF paytran1_cursor%ISOPEN THEN 
     CLOSE paytran1_cursor; 
     END IF; 
     IF v_job = 'S'THEN 
     v_sal := v_sal/52; 
     End if; 
     IF v_job = 'H'THEN 
     v_sal := v_hours * v_pay; 
     END IF; 
     OPEN paytran1_cursor; 
    v_hours := 0; 
     loop 
     FETCH paytran1_cursor INTO v_idno1, v_hourswk; 
     EXIT WHEN paytran1_cursor%NOTFOUND; 
     v_hours := v_hours + v_hourswk; 
     dbms_output.put_line('The current amount is: '||v_hours); 
     END LOOP; 
     INSERT into allinfo1 
      VALUES(v_idno, v_name, v_hours, v_job, v_sal, v_hourswk); 
     CLOSE paytran1_cursor; 
    END LOOP; 
    CLOSE paydata4_cursor; 
END; 
/
SET SERVEROUTPUT OFF 

Это мои таблицы

SQL> select * 
    2 from paydata1; 

IDNO NAME      J  SALARY  PAYHR 
---- ------------------------- - ---------- ---------- 
1111 Ann French    S  75000   0 
2222 Robert Costa    H   0   45 
3333 Linda Ames    H   0   50 
4444 Scott Brooks    S  78000   0 
5555 Susan Ash     S  57000   0 
6666 James Smith    S  55000   0 
7777 Mary Jones    H   0   36 
8888 John Morse    H   0   39 

8 rows selected. 

SQL> select * 
    2 from paytran1; 

IDNO PRO HOURSWK 
---- --- ---------- 
1111 123   20 
1111 456   10 
1111 789   15 
2222 123   17 
2222 456   24 
2222 789   20 
3333 123   20 
3333 789   20 
4444 123   10 
4444 456   28 
4444 789   5 
5555 456   40 
6666 456   44 
7777 456   30 
7777 789   15 
8888 123   10 
8888 456   25 
8888 789   5 

Это мой выход

SQL> select * 
    2 from allinfo1; 

IDNO NAME     HOURS JO  PAY  OTPAY 
---- --------------- ---------- -- ---------- ---------- 
1111 Ann French    45 S  1442   15 
2222 Robert Costa   61 H  2025   20 
3333 Linda Ames    40 H  3050   20 
4444 Scott Brooks   43 S  1500   5 
5555 Susan Ash    40 S  1096   40 
6666 James Smith    44 S  1058   44 
7777 Mary Jones    45 H  1584   15 
8888 John Morse    40 H  1755   5 

8 rows selected. 

Ожидаемый результат должен быть

SQL> выберите * 2 из allinfo1;

IDNO NAME     HOURS JO  PAY  OTPAY 
---- --------------- ---------- -- ---------- ---------- 
1111 Ann French    45 S  1442 
2222 Robert Costa   61 H  2745 
3333 Linda Ames    40 H  2000 
4444 Scott Brooks   43 S  1500 
5555 Susan Ash    40 S  1096 
6666 James Smith    44 S  1058 
7777 Mary Jones    45 H  1620 
8888 John Morse    40 H  1560 
+0

это, вероятно, лучше, чтобы добавить, что ожидаемый результат должен быть. – Nat

+0

добавил ожидаемый –

+0

для столбца HOURS, вы ссылаетесь на колонку v_hours справа? – Nat

ответ

0

Не уверен, что для этого вам нужна хранимая процедура. Если я правильно понял ваш прок правильно, вы пытаетесь сделать что-то вроде этого:

SELECT x.idno, x.name, x.hours, x.j 
     ,DECODE(x.j, 'H', x.hours * y.payhr, y.salary/52) AS Pay 

    FROM (SELECT p.idno, p.name 
       ,SUM(t.HOURSWK) AS hours 
       ,p.j 
      FROM paydata1 p 
      JOIN paytran1 t ON (t.idno = p.idno) 
      GROUP BY p.idno, p.name, p.j 
     ) x 

    JOIN paydata1 y ON(y.idno = x.idno) 
    ORDER BY x.IDNO 

выход:

| IDNO |   NAME | HOURS | J |    PAY | 
|------|--------------|-------|---|--------------------| 
| 1111 | Ann French | 45 | S | 1442.3076923076924 | 
| 2222 | Robert Costa | 61 | H |    2745 | 
| 3333 | Linda Ames | 40 | H |    2000 | 
| 4444 | Scott Brooks | 43 | S |    1500 | 
| 5555 | Susan Ash | 40 | S | 1096.1538461538462 | 
| 6666 | James Smith | 44 | S | 1057.6923076923076 | 
| 7777 | Mary Jones | 45 | H |    1620 | 
| 8888 | John Morse | 40 | H |    1560 | 
+0

Я действительно его выполнил, но это нужно было бы сделать в PL/SQL не базовом sql –

+0

Из интереса, почему это должно быть сделано в PL/SQL, а не SQL? Сам Oracle VP Том Ките рекомендует, чтобы, если проблема может быть решена в SQL, тогда вы должны выбирать это по PL/SQL каждый раз. – Ollie

+0

@ Ollie: Да, я вчера предложил простой SQL-подход. Контекстное переключение - это реальный убийца производительности, если объем данных очень высок. –

Смежные вопросы