PL / SQL процедура Country_demographic - PullRequest
0 голосов
/ 19 февраля 2019

Я застрял с проектом для класса, в котором мне нужно создать пакет под названием Помощь путешественникам.Я сейчас пишу процедуры по отдельности, чтобы посмотреть, работают ли они сами по себе.

Я застрял в пакете country_demographic, который должен получить определенную информацию в указанной стране (можно найтив DBMS_output.put_line section).Процедура создает без каких-либо хлопот, и я был здесь раньше и исправил части моего кода в соответствии с похожей загадкой, которую я нашел, но пытаясь вызвать эту процедуру, используя PL / SQL, я натолкнулся на A numeric or value error.

Если кто-нибудь сможет просмотреть мой код и быстро вернуться ко мне, вы получите мою благодарность.

Ниже приведен мой код для процедуры plsql:

CREATE OR REPLACE PROCEDURE country_demographic (p_country_name IN countries.country_name%TYPE)
IS
TYPE ED_TYPE IS TABLE OF countries%ROWTYPE;
p_country_demo_rec ED_TYPE;
BEGIN
SELECT * BULK COLLECT INTO p_country_demo_rec FROM countries
WHERE country_name = p_country_name;
FOR i IN p_country_demo_rec.FIRST..p_country_demo_rec.LAST
LOOP
DBMS_OUTPUT.PUT_LINE('Country Name:'||p_country_demo_rec(i).country_name ||
    'Location:' || p_country_demo_rec(i).location ||
    'Capitol:' || p_country_demo_rec(i).capitol ||
    'Population:' || p_country_demo_rec(i).population ||
    'Airports:' || p_country_demo_rec(i).airports ||
    'Climate:' || p_country_demo_rec(i).climate );
END LOOP;
IF SQL%NOTFOUND THEN
    RAISE_APPLICATION_ERROR(-20201, 'This country does not exist.');
END IF;
END;

1 Ответ

0 голосов
/ 20 февраля 2019

У меня нет ваших таблиц, поэтому я использовал схему Скотта.

Это то, что у вас сейчас есть:

SQL> create or replace procedure p_test (par_deptno in number)
  2  is
  3    type ed_type is table of emp%rowtype;
  4    p_emp_demo_rec ed_type;
  5  begin
  6    select * bulk collect into p_emp_demo_rec
  7      from emp
  8      where deptno = par_deptno;
  9
 10    for i in p_emp_demo_rec.first .. p_emp_demo_rec.last loop
 11      dbms_output.put_line('Empno: ' || p_emp_demo_rec(i).empno ||
 12        'Ename: ' || p_emp_demo_rec(i).ename
 13        );
 14    end loop;
 15
 16    if sql%notfound then
 17       raise_application_Error(-20201, 'This does not exist');
 18    end if;
 19  end;
 20  /

Procedure created.

Давайте проверим это: во-первых, существует DEPTNO:

SQL> exec p_test(10);
Empno: 7782Ename: CLARK
Empno: 7839Ename: KING
Empno: 7934Ename: MILLER

PL/SQL procedure successfully completed.

SQL>

Теперь, DEPTNO, которого нетсуществовать:

SQL> exec p_test(-2);
BEGIN p_test(-2); END;

*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SCOTT.P_TEST", line 10
ORA-06512: at line 1


SQL>

Wooops!Ошибка!Какая строка является строкой 10?

10    for i in p_emp_demo_rec.first .. p_emp_demo_rec.last loop

Если ничего не было выбрано, то существует ни первое, ни последнее, и FOR вызывает ошибку.Это означает, что вы должны перемещать IF перед циклом FOR, то есть

SQL> create or replace procedure p_test (par_deptno in number)
  2  is
  3    type ed_type is table of emp%rowtype;
  4    p_emp_demo_rec ed_type;
  5  begin
  6    select * bulk collect into p_emp_demo_rec
  7      from emp
  8      where deptno = par_deptno;
  9
 10    if sql%notfound then                                       --> this was moved up
 11       raise_application_Error(-20201, 'This does not exist');
 12    end if;
 13
 14    for i in p_emp_demo_rec.first .. p_emp_demo_rec.last loop
 15      dbms_output.put_line('Empno: ' || p_emp_demo_rec(i).empno ||
 16        'Ename: ' || p_emp_demo_rec(i).ename
 17        );
 18    end loop;
 19  end;
 20  /

Procedure created.

Тестирование:

SQL> exec p_test(-2);
BEGIN p_test(-2); END;

*
ERROR at line 1:
ORA-20201: This does not exist
ORA-06512: at "SCOTT.P_TEST", line 11
ORA-06512: at line 1

Ну, да - это ваш RAISE_APPLICATION_ERROR, а не NUMERIC OR VALUE ERROR.

Итак, небольшая копия / вставка должна исправить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...