使用 Oracle 的 PL/SQL 函数中出现“无效指令”错误

Posted

技术标签:

【中文标题】使用 Oracle 的 PL/SQL 函数中出现“无效指令”错误【英文标题】:Error "Invalid Instruction" in PL/SQL function using Oracle 【发布时间】:2021-05-20 08:35:21 【问题描述】:

这里我正在尝试创建一种布尔函数,但是当我尝试编译它时,它告诉我我的指令“truth INTEGER;”是不正确的。我不知道问题出在哪里,因为我在 Google 上看到的每个代码示例都与我的非常相似。使用 Oracle 对我来说是全新的,所以如果有人可以帮助我,我会有点迷失......

我通过搜索尝试了很多东西,但没有任何效果,所以我在这里寻求帮助......

代码:

CREATE OR REPLACE FUNCTION HISTOTOX.matching_idipl (iDiplNumero INTEGER) RETURN INTEGER
 AS
  cpt INTEGER;
  truth INTEGER;
 
 BEGIN
         SELECT count(*) INTO cpt FROM GARNUCHE.INSC_DIPL WHERE IDIPL_NUMERO = iDiplNumero;
     IF cpt = 1 THEN 
        truth := 1;
     ELSE
        truth := 0;
     END IF;
        RETURN truth;
 END;

【问题讨论】:

您在哪个客户端运行它,如何运行?看起来无论它是什么都不能正确理解 PL/SQL 块,这是我认为 DBeaver 曾经遭受的痛苦。如果它将第一个分号之前的所有内容都作为一个语句,并且要么忽略它,要么运行它并出现您没有显示的错误,然后将truth INTEGER; 视为一个独立命令......我可以想象它可能会抱怨(如“如果您只运行 SQL Developer 中的“未知命令”;或 SP-0734 SQL*Plus),但不知道是否有任何客户端给出“无效指令”。 @Zerkioms 请不要将评论编辑为答案或问题。为此发表评论。如果您有正确理解您的问题所需的其他信息,请将edit 放入您的问题中,以便它可以回答。见Tips for asking a good Structured Query Language (SQL) question。您可能还想访问tour 【参考方案1】:

您报告的不是 Oracle 错误。我在 11g 中复制了您的代码,一切正常:

SQL>  CREATE OR REPLACE FUNCTION matching_idipl (iDiplNumero INTEGER) RETURN INTEGER
  2   AS
  3    cpt INTEGER;
  4    truth INTEGER;
  5
  6   BEGIN
  7           SELECT count(*) INTO cpt FROM INSC_DIPL WHERE IDIPL_NUMERO = iDiplNumero;
  8       IF cpt = 1 THEN
  9          truth := 1;
 10       ELSE
 11          truth := 0;
 12       END IF;
 13          RETURN truth;
 14   END;
 15   /

Function created.

SQL> select matching_idipl(1) from dual;

MATCHING_IDIPL(1)
-----------------
                1

SQL>

那么:您究竟在哪里执行了该代码?您收到了哪个错误(请提供确切的消息和错误代码)?

【讨论】:

这是我的执行行:SELECT HISTOTOX.matching_idipl(10) FROM dual;我的错误:包或函数 GET_ETUD_NUM 处于无效状态当我收到此错误时,我认为问题来自我的代码,所以我编译它并看到错误,这就是我得到的:错误消息 = 第 7 行,第 26 列:PL / SQL:ORA-00904:“IDIPLNUMERO”:无效标识符 ORA-06550:第 2 行,第 2 列:PL / SQL:忽略 SQL 语句 ORA-06550:第 8 行,第 2 列:PLS-00372:RETURN 语句不能包含过程中的表达。 ORA-06550:第 8 行,第 2 列:PL / SQL:语句被忽略 ORA-00904 表示该表中没有 IDIPLNUMERO 列。请注意,您发布的代码表明它的名称是 IDIPL_NUMERO。有关更多信息,您应该发布表格描述。另一个错误(关于 RETURN)说您试图在 procedure 中返回;这应该是一个函数,对吧? 我无法理解......我的意思是,如果 IDIPLNUMERO 不在表中,因为它是我的函数的参数,这很明显。在这里,我比较了 IDIPL_NUMERO(存在于表中)和 IDIPLNUMERO(我的函数的参数)。那么为什么 Oracle 会在表中搜索我的参数呢?对于回报,我不确定,但我显然在这里是一个函数,所以为什么它在谈论我的过程? 如我所说:贴表说明和你最新的功能代码。 请用上述内容更新问题,请勿将其放在另一条评论中。

以上是关于使用 Oracle 的 PL/SQL 函数中出现“无效指令”错误的主要内容,如果未能解决你的问题,请参考以下文章

在 ORACLE 的 select 语句中从 PL/SQL 调用函数

过程中的 Pl/Sql Oracle 函数

如何在 Oracle PL/SQL 函数中使用变量

ORACLE PL/SQL:使用多个参数调用存储过程函数(DML 查询)

在 oracle 中使用正则表达式查找 POBOX - PL/SQL

pl/sql:在oracle中选择作为函数的参数/参数