【问题标题】:Select in procedure Oracle在过程 Oracle 中选择
【发布时间】:2019-09-19 22:06:01
【问题描述】:

我已经在 Oracle 中定义了这个过程:

CREATE OR REPLACE Procedure InsertCliente
(dni IN VARCHAR, nombre IN VARCHAR, apellidos IN VARCHAR, apellido2 IN VARCHAR, direccion IN VARCHAR, 
    CALLE IN VARCHAR, NUMERO IN NUMBER, PISO IN VARCHAR, CIUDAD IN VARCHAR, CODPOSTAL IN NUMBER, 
    telefono IN NUMBER, edad IN DATE, email IN VARCHAR)
IS
    claveDireccion number;

BEGIN
    IF apellido2 is null THEN
        INSERT INTO Cliente(DNI,Telefono,Direccion,Email,Edad,Apellidos,Nombre) 
        VALUES (dni,telefono,direccion,email,TO_DATE(edad,'YYYY-MM-DD'),apellidos,nombre);
ELSE
    claveDireccion := (SELECT ID_DIRECCION FROM DIRECCION@SCHEMA2BD2 WHERE ID_DIRECCION=Direccion);
    IF claveDireccion is not null THEN
        INSERT INTO TITULAR@SCHEMA2BD2(DNI,Nombre,Apellido1, Apellido2, Direccion,Telefono,Fecha_Nacimiento) 
            VALUES (DNI,Nombre,Apellidos, Apellido2, Direccion,Telefono,TO_DATE(Fecha_Nacimiento,'YYYY-MM-DD'));
    ELSE
        raise_application_error(-20001, 'La direccion proporcionada no existe');
    END IF;
END IF;

END;
/

但我从 Oracle 收到以下错误:

LINE/COL ERROR
-------- -----------------------------------------------------------------
13/22    PLS-00103: Encountered the symbol "SELECT" when expecting one of
     the following:
     ( - + case mod not null others <an identifier>
     <a double-quoted delimited-identifier> <a bind variable> avg
     count current exists max min prior sql stddev sum variance
     execute forall merge time timestamp interval date
     <a string literal with character set specification>
     <a number> <a single-quoted SQL string> pipe

13/96    PLS-00103: Encountered the symbol ")" when expecting one of the
     following:

LINE/COL ERROR
-------- -----------------------------------------------------------------
     . ( * @ % & - + ; / at for mod rem <an exponent (**)> and or
     group having intersect minus order start union where connect
     ||

20/6     PLS-00103: Encountered the symbol "IF" when expecting one of the
     following:
     ; <an identifier> <a double-quoted delimited-identifier>
     delete exists prior <a single-quoted SQL string>

我不知道那里发生了什么。这只是一个选择语句,它被分配给一个变量。有什么帮助吗?

【问题讨论】:

    标签: sql oracle select plsql procedure


    【解决方案1】:

    使用INTO:

    SELECT ID_DIRECCION INTO claveDireccion
    FROM DIRECCION@SCHEMA2BD2
    WHERE ID_DIRECCION = Direccion;
    

    逻辑没有意义。为什么不直接使用这个?

    claveDireccion := Direccion;
    

    我建议您为参数命名,以便与列名区分开来:

    CREATE OR REPLACE Procedure InsertCliente (
        in_dni IN VARCHAR,
        in_nombre IN VARCHAR,
        in_apellidos IN VARCHAR,
        in_apellido2 IN VARCHAR,
        in_direccion IN VARCHAR, 
        in_CALLE IN VARCHAR,
        in_NUMERO IN NUMBER,
        in_PISO IN VARCHAR,
        in_CIUDAD IN VARCHAR,
        in_CODPOSTAL IN NUMBER, 
        in_telefono IN NUMBER,
        in_edad IN DATE,
        in_email IN VARCHAR
    ) IS
        p_claveDireccion number;
    BEGIN
        . . .
    END;
    

    这有助于防止存储过程主体出现问题。

    【讨论】:

    • 现在它返回:LINE/COL ERROR -------- ------------- ---------------------------------------------------- 14/3 PL/SQL: SQL 语句被忽略14/48 PL/SQL:ORA-00942:表或视图不存在 16/4 PL/SQL:SQL 语句被忽略 16/16 PL/SQL:ORA-00942:表或视图不存在
    • 程序的所有者是谁?谁是桌子的主人?如果过程所有者不是表所有者,那么您需要使用所有者名称来限定表名称:从 owner.tablename 中选择一些内容。否则,该过程的所有者需要在“owner.tablename”上有一个同义词,并引用该同义词。
    猜你喜欢
    • 2018-10-23
    • 2017-07-23
    • 1970-01-01
    • 2015-05-02
    • 2011-05-14
    • 2015-05-02
    • 2020-06-15
    • 1970-01-01
    • 2012-09-03
    相关资源
    最近更新 更多