Процедура PL / SQL с возвращаемым значением SELECT - PullRequest
0 голосов
/ 05 сентября 2018

Новичок в PL / SQL, и я попытался возиться с этим и разобраться, но в растерянности. Надеюсь, что вы парень опыт и руководство.

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

Любая помощь приветствуется.

create or replace
procedure customer_credit(cust_ID IN NUMBER) AS
    credit_num NUMBER;
    begin
       select CUSTOMER_ID, CREDIT_LIMIT from OE.CUSTOMERS WHERE CUSTOMER_ID=cust_ID;
       dbms_output.put_line('Credit Limit = ', || credit_num);
end;
/
exec customer_credit(145);

Ответы [ 5 ]

0 голосов
/ 11 сентября 2018

это будет работать:

create or replace
procedure customer_credit(cust_ID IN NUMBER) AS
    credit_num NUMBER;
    begin
       select CREDIT_LIMIT into credit_num from OE.CUSTOMERS WHERE CUSTOMER_ID=cust_ID;
       dbms_output.put_line('Credit Limit = ', || credit_num);
end;
/
exec customer_credit(145);
0 голосов
/ 05 сентября 2018

Вы можете использовать Cursor, альтернативно:

create or replace procedure customer_credit( cust_ID IN NUMBER) as
begin
  for c in ( select CUSTOMER_ID, CREDIT_LIMIT from CUSTOMERS WHERE CUSTOMER_ID=cust_ID )
  loop
    dbms_output.put_line('Credit Limit = '|| c.CREDIT_LIMIT);
  end loop;
end;

Кстати, в предложении dbms_output.put_line() есть опечатка (comma). Как заявил @OldProgrammer, для просмотра результатов необходимо выдать set serveroutput on.

0 голосов
/ 05 сентября 2018

Если вы хотите, чтобы значение было возвращено, лучше определить его как FUNCTION, а затем вызвать функцию в вашем коде. Это позволит вам использовать его как в процедурах PL / SQL, так и в инструкциях SELECT. Вам также следует использовать обработчики исключений для обработки ситуаций. Я изменил ваш пример, чтобы проиллюстрировать необходимые изменения:

create or replace
function customer_credit(cust_ID IN NUMBER)
return number
IS
    credit_num NUMBER;
begin
       select CREDIT_LIMIT
       into   credit_num
       from OE.CUSTOMERS WHERE CUSTOMER_ID=cust_ID;
       dbms_output.put_line('Credit Limit = ', || credit_num);
       return(credit_num);
exception
  when NO_DATA_FOUND then
    return(0);
end;
/
select customer_credit(145) from dual;

Надеюсь, это поможет.

0 голосов
/ 05 сентября 2018

Я полагаю, что ваша процедура скомпилирована с предупреждениями, вы объявили переменную credit_num, но не передаете никакого значения в эту переменную (так как эта переменная может вернуть что-то, если у нее ничего нет)

Если вы хотите получить CREDIT_LIMIT из вашей таблицы, то вам нужно написать свой код, используя Select Into для ex: -

select CREDIT_LIMIT 
into credit_num 
from OE.CUSTOMERS 
where CUSTOMER_ID=cust_id;

Просто измените свое заявление о выборе, и вы готовы продолжить свою Программу.

0 голосов
/ 05 сентября 2018

Есть множество вариантов. Одним из них является использование SELECT ... INTO:

create or replace
procedure customer_credit(cust_ID IN NUMBER) AS
    credit_num NUMBER;
    begin
       select CREDIT_LIMIT 
       into credit_num
       from OE.CUSTOMERS WHERE CUSTOMER_ID=cust_ID;
       dbms_output.put_line('Credit Limit = ', || credit_num);
end;

Если строка не найдена, будет сгенерировано исключение. Вы можете исправить это, либо добавив обработчик исключений, либо используя явный метод курсора open / fetch / close. Если вы выполняете процедуру из sqlplus, вам нужно сначала вызвать

set serveroutput on

чтобы увидеть результаты dbms_output.

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