2010-01-08 236 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中完成。