0

我想当这种情况发生时使用声明请求新变量,但是当我运行它时,它会在开始时询问我所有内容:

Set serveroutput on;

DECLARE 
      v_aid ALUNO.AID%TYPE := &vs_aid;
      v_aluno ALUNO%ROWTYPE;
 BEGIN 

     SELECT *
     INTO v_aluno
     FROM ALUNO
     WHERE aid = v_aid;
    DBMS_OUTPUT.PUT_LINE ('-------------------------'); 
     DBMS_OUTPUT.PUT_LINE ('Já existe um ID com os seguintes dados:'); 
     DBMS_OUTPUT.PUT_LINE ('Nome: '||v_aluno.nome||' | Data Nascimento: '|| v_aluno.data_nascimento); 
     DBMS_OUTPUT.PUT_LINE ('-------------------------'); 
      EXCEPTION 
      WHEN NO_DATA_FOUND THEN 
        DECLARE 
        aid int := v_aid;
        nome varchar(30) := '&sv_nome';
        data_nascimento date := '&sv_data';

      INSERT INTO Aluno 
           (     aid 
                , nome 
                , data_nascimento 
                ) 
      VALUES  
           ( aid 
                , nome 
                , data_nascimento 
                ) ;



 END;

抱歉,如果我的代码做得不好,我不是 SQL 专家,只是试图解决问题。

编辑:我正在使用 oracle PL/SQL

4

1 回答 1

3

改用存储过程:

CREATE OR REPLACE PROCEDURE ADD_STUDENT(I_STUDENTID IN NUMBER, I_STUDENTNAME AS VARCHAR2, I_BIRTHDATE AS DATE) IS
    v_aluno ALUNO%ROWTYPE;
BEGIN 

    SELECT * INTO v_aluno FROM ALUNO WHERE aid = I_STUDENTID;
    DBMS_OUTPUT.PUT_LINE ('-------------------------'); 
    DBMS_OUTPUT.PUT_LINE ('Já existe um ID com os seguintes dados:'); 
    DBMS_OUTPUT.PUT_LINE ('Nome: '||v_aluno.nome||' | Data Nascimento: '|| v_aluno.data_nascimento); 
    DBMS_OUTPUT.PUT_LINE ('-------------------------'); 

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
        INSERT INTO Aluno 
           (     aid 
                , nome 
                , data_nascimento 
                ) 
        VALUES  
           ( I_STUDENTID 
                , I_STUDENTNAME 
                , I_BIRTHDATE 
                ) ;
    WHEN OTHERS THEN RAISE;
END ADD_STUDENT;

并这样称呼它:

DECLARE
    sName       Aluno.nome%TYPE;
    iId         Aluno.aid%TYPE;
    dtBirthDate Aluno.data_nascimento%TYPE;
BEGIN
    ADD_STUDENT(iId, sName, dtBirthDate);
END;
于 2013-11-05T18:58:58.033 回答