2010-01-08 3 views
1

Как я могу сделать процедуру oracle с oracle xe, как я могу проверить, является ли вход действительным или нет? ex: если мой ввод является номером, и я набираю char, что процедура выдает что-то в этом случае, я имел дело с SQL, но не с такими процедурами? любая помощь приветствуетсяОракул хранимых процедур

UPDATE

Это был фиктивный пример .. то, что я имел в виду, чтобы начать с самой простой вещи, а затем перейти к более сложным примерам, что я на самом деле нужно проверить, a field book в table books равно 0, затем остановите borrowing query, чтобы вставить вставить вставить.

+0

Что вы подразумеваете под 'stop loaning query'? –

+0

Его просто имя запроса, остановить его от выполнения – ant

+0

А, я вижу. Я думаю, нам нужна дополнительная информация об этой процедуре, о том, что она на самом деле делает и когда прекратить это делать. –

ответ

3

Вот пример такого процесса, который, я думаю, вы хотите. Мне пришлось сделать пару (я надеюсь, образованных) догадок заполнить пробелы в вашем примере.

create or replace procedure borrow_book 
    (p_book in books.id%type 
     , p_borrower in library_member.id%type) 
as 
    cursor cur_book is 
        select out_flag 
     from books 
     where id = p_book 
     for update of out_flag; 
    rec_book cur_book%rowtype; 
begin 
    open cur_book; 
    fetch cur_book into rec_book; 

    if rec_book.out_flag = 0 
    then 
     raise_application_error(-20000, 'Book is already out on loan.'); 
    else    
     insert into loans (book_id, borrower_id, issue_date) 
     values (p_book, p_borrower, sysdate); 
        update books 
     set out_flag = 0 
     where current of cur_books; 
    end if; 

    close cur_book; 
end borrow_book; 
/ 
+0

@APC: +1, звучит как хорошая догадка, по крайней мере лучше, чем у меня. Моя текущая интерпретация вопроса заключается в том, что в таблице 'book' есть какой-то счетный столбец (' book'), который должен быть уменьшен, если еще не 0. Но нам придется оставить это для OP для очистки. –

0

Вы уже указали параметры хранимых процедур. Если у вас есть параметр «int», кто-то вводит значение «ABC» для значения, Oracle это выйдет. Вам не придется/нужно.

+0

Я только что обновил вопрос – ant

0

Что-то вроде этого?

create or replace PROCEDURE BOOK() AS 
BEGIN 
    declare cursor cur_b is 
     select * from books; 
    BEGIN 
     FOR book_row IN cur_b LOOP 
      IF book_row.book=0 THEN 
       INSERT INTO ... 
      END IF; 
     end loop; 
    end; 
END BOOK; 
1

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

Один SQL-вставка должна делать (если я правильно понял ваш вопрос прямо):

INSERT INTO new_table 
SELECT id, val FROM books WHERE book = 0; 

Если вы все еще нужна процедура, положить, что в процедуру:

CREATE OR REPLACE PROCEDURE my_proc AS 
BEGIN 
    INSERT INTO new_table 
    SELECT id, val FROM books WHERE book = 0; 
END my_proc; 

Try, чтобы избежать зацикливание курсора в PL/SQL и вставка значений, когда это можно сделать в одном SQL.

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