2010-01-08 249 views
1

如何用oracle xe製作oracle程序,我該如何檢查輸入是否有效?例如:如果我的輸入是數字,而且我輸入的字符數是程序打印出來的東西,那麼我已經處理了SQL,但沒有處理這些類型的程序?任何幫助表示讚賞oracle存儲過程

UPDATE

這是一個虛擬的例子..我的意思是,從最簡單的事情開始然後移動到更復雜的例子,就是我真正需要的是檢查一個field booktable books等於0,然後停止borrowing query插入else插入。

+0

「停止借閱查詢」是什麼意思? – 2010-01-08 18:28:47

+0

它只是查詢的名稱,請阻止它執行 – ant 2010-01-08 19:16:34

+0

啊,我明白了。我認爲我們需要更多關於該程序的信息,實際上做了什麼以及何時停止這樣做。 – 2010-01-08 19:47:57

回答

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'中有一些count列('book'),如果不是0,應該減少。但是我們必須把它留給OP來清除。 – 2010-01-09 12:33:09

0

您的存儲過程參數已經被強類型化。如果你有一個「int」參數,那麼有人在「ABC」中鍵入這個值,Oracle會通過它。你不需要/不需要。

+0

我剛剛更新了問題 – ant 2010-01-08 18:05:23

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; 

儘量避免在PL/SQL中循環遊標並插入值,可以在單個SQL中完成。