过程中的Oracle选择查询错误[重复]

Posted

技术标签:

【中文标题】过程中的Oracle选择查询错误[重复]【英文标题】:Oracle select query error inside procedure [duplicate] 【发布时间】:2013-12-25 11:19:18 【问题描述】:

在过程中运行select 查询时出现错误。错误打印如下:

[错误] PLS-00428 (24: 9):PLS-00428:此 SELECT 语句中应有一个 INTO 子句

CREATE OR REPLACE PACKAGE BODY PACK_EMP
IS
    PROCEDURE find_employee(
        P_ID NUMBER,
        P_ERR OUT VARCHAR2
    )
    IS
    BEGIN
        IF P_ID IS NULL THEN
            SELECT * FROM EMPLOYEE WHERE ID = P_ID
        ELSE
            P_ERR := 'An error occured on database!!';
        END IF;
        EXCEPTION
        WHEN OTHERS THEN
            P_ERR := SQLERRM;
    END;
END;

【问题讨论】:

在 PL/SQL 中,当您执行任何 SELECT 时,您需要使用 INTO 子句指定将选择结果存储在哪个变量中:SELECT 1 INTO v_val FROM DUAL。你想通过这个过程达到什么目的? 谢谢你的帮助,我很粗心:) 【参考方案1】:
CREATE OR REPLACE PACKAGE BODY PACK_EMP
IS
    PROCEDURE find_employee(
        P_ID NUMBER,
        P_ERR OUT VARCHAR2,
        V_VAL OUT VARCHAR
    )
    IS
    BEGIN
        IF P_ID IS NULL THEN
            SELECT FIRTSNAME ||' '||LASTNAME INTO V_VAL FROM EMPLOYEE WHERE ID = P_ID
        ELSE
            P_ERR := 'An error occured on database!!';
        END IF;
        EXCEPTION
        WHEN OTHERS THEN
            P_ERR := SQLERRM;
    END;
END;

【讨论】:

【参考方案2】:

使用行类型。另外我认为您的意思是说“如果 P_ID IS NOT NULL THEN ...”,因为如果它为空,那么您的选择将永远无法工作。

CREATE OR REPLACE PACKAGE BODY PACK_EMP
IS
    PROCEDURE find_employee(
        P_ID NUMBER,
        P_ERR OUT VARCHAR2
    )
    IS
    empRec employee%rowtype; /* ADD THIS LINE */
    BEGIN
        IF P_ID IS NOT NULL THEN
            SELECT * into empRec FROM EMPLOYEE WHERE ID = P_ID;
            --now you can reference the columns like this: empRec.id
        ELSE
            P_ERR := 'An error occured on database!!';
        END IF;
        EXCEPTION
        WHEN OTHERS THEN
            P_ERR := SQLERRM;
    END;
END;

【讨论】:

以上是关于过程中的Oracle选择查询错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

检查架构中的 IF 表 EXISTS 时发生 Oracle PL/SQL 过程错误 [重复]

Oracle SQL 中的插入选择查询缺少表达式错误

Oracle 过程不是按函数分组的错误 00979

如何修复存储过程 Oracle PL/SQL 的错误?

Oracle 错误创建过程需要 iNTO [重复]

Oracle - IF 子句中的子查询 [重复]