当前位置: 首页 > 知识库问答 >
问题:

使用存储过程的PL/SQL错误-必须声明标识符

宇文俊明
2023-03-14

这是我成功的存储过程

CREATE OR REPLACE Procedure add_student
    (ns_sid IN STUDENTS.sid%type,
    ns_firstname IN STUDENTS.firstname%type,
    ns_lastname IN STUDENTS.lastname%type,
    ns_status IN STUDENTS.status%type,
    ns_gpa IN STUDENTS.gpa%type,
    ns_email IN STUDENTS.email%type)
IS
BEGIN
    INSERT INTO STUDENTS (sid, firstname, lastname, status, gpa, email)
    VALUES (ns_sid, ns_firstname, ns_lastname, ns_status, ns_gpa, ns_email);
END;
/

这是首先生成表的调用

create table students (sid char(4) primary key check (sid like 'B%'),
firstname varchar2(15) not null, lastname varchar2(15) not null, status varchar2(10) 
check (status in ('freshman', 'sophomore', 'junior', 'senior', 'graduate')), 
gpa number(3,2) check (gpa between 0 and 4.0), email varchar2(20) unique);

最初,我试图用一些预定义的参数调用存储过程。

BEGIN
    add_student("B100", "Steve", "Stevenson", "senior", 2.31, "Ssteve@edu");
END;
/

这导致错误“PLS-00201:标识符'B100'必须声明”

我是PL/SQL的新手,很难解决这个问题。我尝试添加DECLARE语句

DECLARE
    ns_sid STUDENTS.sid%type;
BEGIN
    ns_sid := "B100";
    add_student(ns_sid, "Steve", "Stevenson", "senior", 2.31, "Ssteve@edu");
END;
/

这仍然会导致错误“PLS-00201:必须声明标识符‘B100’”,但它表示“PL/SQL:忽略语句”,然后表示“PLS-00201:必须声明标识符‘Steve’”

进一步挖掘,我试图将firstname声明为varchar,看看它是否有效。剧透,它没有。

DECLARE
    ns_sid STUDENTS.sid%type;
    ns_fn varchar(15);
BEGIN
    ns_sid := "B100";
    ns_fn := "Steve";
    add_student(ns_sid, ns_fn, "Stevenson", "senior", 2.31, "Ssteve@edu");
END;
/

这给了三个PLS-00201说“B100”、“史蒂夫”和“史蒂文森”必须申报。

我希望有人能澄清我的误解。谢谢

共有1个答案

岳奇逸
2023-03-14

在Oracle中处理字符串时,不要使用双引号,而是使用单引号,例如。

BEGIN
  add_student('B100', 'Steve', 'Stevenson', 'senior', 2.31, 'Ssteve@edu');
END;
/
 类似资料:
  • 错误消息: [Microsoft][ODBC驱动程序for Oracle][Oracle]ORA-06550:第1行,第7列:PLS-00201:标识符STORED_PROCEDURE必须声明ORA-06550:第1行,第7列:PL/SQL:语句被忽略

  • 所以我一直有这个错误,我不知道发生了什么。我在谷歌上搜索了一下,读了一些关于这个错误的问题,但什么都没用。我只想运行它,这样我就可以完成我的项目。 错误:开始低库存;结束;*第1行错误:ORA-06550:第1行,第9列:PLS-00201:标识符“LOWINVENTORY”必须声明ORA-06550:第1行,第7列:PL/SQL:忽略语句 编辑: 表创建:

  • 我试着按照步骤在Toad中运行以下代码 1。初始化变量2并为其分配日期。打印出来确认3。然后使用变量检查日期范围的my when子句<你知道我做错了什么吗? --检查我的time子句 --检查:this_day之间(2018年4月1日至2018年12月1日) ORA-06550:第1行,第21列:PLS-00201:标识符“01-JAN-2018”必须声明ORA-06550:第1行,第7列:PL/

  • 我正在使用SODA for Java存储和检索Oracle12c DB中的文档。我正在效仿这个例子。 这一例外背后的原因将是什么?

  • 作为标题,我正在Oracle上编写一些存储过程,首先我检查了版本 有结果 ... 并尝试NVL2与常规SQL查询 结果似乎是对的 ... 所以我确认11g确实支持NLV2功能,我现在可以开始编写我的存储过程,如下所示: Oracle告诉我它编译有错误,即 PLS-00201:必须声明标识符“NVL2” 为什么函数在常规查询中工作,但在存储过程中变得未声明?