【问题标题】:oracle stored proceduresoracle 存储过程
【发布时间】:2011-01-03 00:40:25
【问题描述】:

如何使用 oracle xe 制作 oracle 程序,如何检查输入是否有效?例如:如果我的输入是数字并且我输入 char 程序会在这种情况下打印出一些东西,我已经处理了 SQL 但没有处理这些程序?任何帮助表示赞赏

更新

这是一个虚拟示例.. 我的意思是从最简单的事情开始,然后继续进行更复杂的示例,我真正需要的是检查 table books 中的 field book 是否等于 0 然后停止borrowing query 插入,否则插入。

【问题讨论】:

  • stop borrowing query 是什么意思?
  • 只是查询的名称,停止执行
  • 啊,我明白了。我认为我们需要有关该程序的更多信息,它实际上做了什么以及何时停止。

标签: sql oracle stored-procedures plsql oracle-xe


【解决方案1】:

这是我认为您想要的那种过程的示例。我不得不做出几个(我希望是受过教育的)猜测来填补你的例子中的空白。

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;
/   

【讨论】:

  • @APC:+1,听起来不错,至少比我的要好。我目前对这个问题的解释是表 book 中有某种计数列 (book),如果还不是 0,应该减少它。但我们必须把它留给 OP 来清除。跨度>
【解决方案2】:

您的问题听起来不像您需要 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 中完成。

【讨论】:

    【解决方案3】:

    您的存储过程参数已经是强类型的。如果你有一个“int”参数,有人输入“ABC”作为值,Oracle 将通过它。您不必/不需要。

    【讨论】:

      【解决方案4】:

      这样的?

      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;
      

      【讨论】: