2010-01-08 11 views
1

Comment puis-je effectuer une procédure Oracle avec Oracle XE, comment puis-je vérifier si l'entrée est valide ou non? ex: si mon entrée est number et que je tape char, cette procédure imprime quelque chose dans ce cas, j'ai traité avec SQL mais pas avec ce genre de procédures? toute aide est appréciéeprocédures Oracle stockées

MISE À JOUR

Ce fut un exemple fictif .. ce que je voulais dire est de commencer par la chose la plus simple de passer ensuite à des exemples plus complexes, ce que je dois vérifier si réellement est field book en table books est égal à 0 puis arrêter borrowing query pour insérer l'insertion else.

+0

Qu'entendez-vous par 'arrêter d'emprunter la requête'? –

+0

C'est juste le nom de la requête, l'arrêter d'exécuter – ant

+0

Ah, je vois. Je pense que nous avons besoin de plus d'informations sur cette procédure, ce qu'elle fait réellement et quand arrêter de le faire. –

Répondre

3

Voici un exemple du type de processus que vous voulez. J'ai dû faire quelques suppositions (je l'espère) pour combler les lacunes dans votre exemple.

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, semble être une bonne supposition, au moins mieux que la mienne. Mon interprétation actuelle de la question est qu'il y a une sorte de colonne de compte ('book') dans la table' book', qui devrait être diminuée si elle n'est pas déjà 0. Mais nous devrons laisser cela à l'OP pour clearifier. –

0

Les paramètres de procédure stockés sont déjà fortement typés. Si vous avez un paramètre "int", quelqu'un tape "ABC" pour la valeur, Oracle le sortira. Vous ne devrez pas/devez.

+0

Je viens de mettre à jour la question – ant

0

Quelque chose comme ça?

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

Votre problème ne semble pas comme si vous auriez besoin PL/SQL.

Un seul insert SQL doit faire (si je comprends bien votre question à droite):

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

Si vous avez besoin d'une procédure, mettre cela dans une procédure:

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

Essayez d'éviter boucle sur un curseur en PL/SQL et en insérant des valeurs, quand cela pourrait être fait dans un seul SQL.