PLS-00201:必须声明标识符“ISDATE”

Posted

技术标签:

【中文标题】PLS-00201:必须声明标识符“ISDATE”【英文标题】:PLS-00201: identifier 'ISDATE' must be declared 【发布时间】:2020-08-26 13:58:36 【问题描述】:

以下是我的程序:

CREATE OR REPLACE PROCEDURE proc_InsertNewCustomer( IN_CustName IN VARCHAR,
                                                    IN_CustContact IN VARCHAR,
                                                    IN_DateOfBirth IN VARCHAR,
                                                    IN_CustAddress IN VARCHAR,
                                                    IN_PostalCode IN VARCHAR) AS
v_newCustID customer.customerID%TYPE;
v_newAddressID customeraddress.addressid%TYPE;
v_location number(5);
e_invalidDate exception;
e_invalidPostalCode exception;

BEGIN

   IF (ISDATE(IN_DateOfBirth) = false) THEN
       raise e_invalidDate;
   ELSE
       IF NOT EXISTS(SELECT locationid FROM location WHERE locationpostcode = IN_PostalCode) THEN
             raise e_invalidPostalCode;
       ELSE
             v_location := locationid;   
       END IF;
   END IF;

   v_newCustID := 'C'||customerID.nextval;
   v_newAddressID := addressid.nextval;

   INSERT INTO customer values(v_newCustID, IN_CustName, IN_CustContact, TO_DATE(IN_DateOfBirth,'dd/mm/yyyy'));
   INSERT INTO customeraddress values(TO_NUMBER(v_newAddressID, '999'), IN_CustAddress, v_location);
   INSERT INTO addresslist values(TO_NUMBER(v_newAddressID, '999'), v_newCustID, 1);

   DBMS_OUTPUT.PUT_LINE(chr(10));
   DBMS_OUTPUT.PUT_LINE('New staff added successfully.');
   DBMS_OUTPUT.PUT_LINE(chr(10));
   DBMS_OUTPUT.PUT_LINE('Customer ID: '||v_newCustID);
   DBMS_OUTPUT.PUT_LINE('Customer Name: '||IN_CustName);
   DBMS_OUTPUT.PUT_LINE('Customer Contact: '||IN_CustContact);
   DBMS_OUTPUT.PUT_LINE('Customer Birthday: '||IN_DateOfBirth);
   DBMS_OUTPUT.PUT_LINE('Customer Address ID: '||v_newAddressID);
   DBMS_OUTPUT.PUT_LINE('Customer Address: '||IN_CustAddress);
   DBMS_OUTPUT.PUT_LINE('Postal Code: '||v_location);

EXCEPTION
     WHEN e_invalidDate THEN
        DBMS_OUTPUT.PUT_LINE('Invalid Input: Wrong Date of Birth input.');
     WHEN e_invalidPostalCode THEN
        DBMS_OUTPUT.PUT_LINE('Invalid Input: PostalCode does not exist.');
        rollback;

END;
/

我遇到了一些错误

14/4     PL/SQL: Statement ignored
14/8     PLS-00201: identifier 'ISDATE' must be declared
24/4     PL/SQL: Statement ignored
24/24    PLS-00201: identifier 'CUSTOMERID.NEXTVAL' must be declared
25/4     PL/SQL: Statement ignored
25/22    PLS-00201: identifier 'ADDRESSID.NEXTVAL' must be declared

我的客户 ID 将是:

C00001 C00002 C00003 ......

我的地址 ID 将是:

001
002
003
...
501
502

我想用 .nextval 和地址 id 增加 customerid,但我不知道该怎么做。寻求帮助。

【问题讨论】:

Oracle 没有函数isdate()。要么自己定义,要么使用不同的机制(例如转换为日期并捕获错误)。 您似乎也没有创建您尝试使用的序列。为什么将所有参数作为字符串传递,而不是将过程参数声明为它们所代表的数据的正确数据类型?例如,如果您将 IN_DateOfBirth 设为 DATE,则无需在过程中对其进行测试或转换 - 调用者必须提供有效日期。 【参考方案1】:

Oracle 没有函数ISDATE 来检查字符串类型。但是您可以编写自己的函数并使用它。例如:

function my_is_date( p_str in varchar2 ) return number
is
    v_date date;
begin
    v_date := to_date(p_str, 'dd.mm.yyyy');
    return 1;
exception
    when others then
        return 0;
end;    

【讨论】:

以上是关于PLS-00201:必须声明标识符“ISDATE”的主要内容,如果未能解决你的问题,请参考以下文章

PLS-00201 标识符必须声明为引用用户定义类型为 SYS

必须声明错误 PLS-00201 标识符

PL SQL,错误(32,43):PLS-00201:必须声明标识符“HR”

PLS-00201:必须声明标识符“TYPE”

Oracle TYPE 声明抛出错误 PLS-00201 - 必须声明标识符

PLS-00201:必须声明标识符“schema.cursorname”