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
PL SQL,错误(32,43):PLS-00201:必须声明标识符“HR”