【问题标题】:PL/SQL Using stored procedure error - Identifier must be declaredPL/SQL 使用存储过程错误 - 必须声明标识符
【发布时间】:2018-09-20 21:25:04
【问题描述】:

这是我成功存储的过程

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'”

进一步挖掘我尝试将名字声明为 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”、“史蒂夫”和“史蒂文森”必须声明。

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

【问题讨论】:

    标签: database oracle plsql


    【解决方案1】:

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

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

    【讨论】:

    • 这不是 Oracle 特有的。字符串常量在 SQL 中总是用单引号指定(而 PL/SQL 只是使用相同的基本规则)
    • 这非常有效!我应该知道这很简单
    • 对;太糟糕了,你花了这么多时间来写一个这么好的问题,而答案只是一个小小的单引号......
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2020-11-27
    相关资源
    最近更新 更多