[英]CONCAT two strings into one text variable PL/SQL SQL Developer
使用 SQL Developer 我試圖將 firstname 和 lastname 列值連接到 PL/SQL 中的 lv_password 文本變量中,但到目前為止失敗了。 代碼和錯誤報告如下。 我嘗試以各種方式對其進行格式化,在我看來這一切都符合指導方針,但我顯然做錯了一些事情。
CREATE OR REPLACE
PROCEDURE member_ck
(lv_cust_id IN bb_shopper.username%TYPE,
lv_password IN OUT VARCHAR,
lv_cookie OUT bb_shopper.cookie%TYPE,
p_check OUT VARCHAR2)
AS
BEGIN
SELECT firstname || ' ' || lastname, cookie
INTO lv_password, lv_cookie
FROM bb_shopper
WHERE UPPER(lv_cust_id) = UPPER(username)
AND lv_password = password;
DBMS_OUTPUT.PUT_LINE('Name: ' || lv_password || ' Cookie #: ' || lv_cookie);
EXCEPTION
WHEN NO_DATA_FOUND THEN
p_check := 'INVALID';
DBMS_OUTPUT.PUT_LINE('Incorrect login information');
END member_ck;
/
DECLARE
lv_cust_id bb_shopper.username%TYPE := 'rat55';
lv_password bb_shopper.password%TYPE := 'kile';
lv_cookie bb_shopper.cookie%TYPE;
p_check VARCHAR(7);
BEGIN
member_ck(lv_cust_id, lv_password, lv_cookie, p_check);
END;
錯誤報告
Error report -
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "ORA215.MEMBER_CK", line 8
ORA-06512: at line 7
06502. 00000 - "PL/SQL: numeric or value error%s"
*Cause: An arithmetic, numeric, string, conversion, or constraint error
occurred. For example, this error occurs if an attempt is made to
assign the value NULL to a variable declared NOT NULL, or if an
attempt is made to assign an integer larger than 99 to a variable
declared NUMBER(2).
*Action: Change the data, how it is manipulated, or how it is declared so
that values do not violate constraints.
lv_password
是第二個參數'kile'
作為它的值VARCHAR2
IN OUT
參數(使用VARCHAR2
,而不是VARCHAR
),因此其長度隱式設置為length('kile') = 4
如果您將其測試為例如
SELECT substr(firstname || ' ' || lastname, 1, 5) --> note 5
它也會失敗。 但,
SELECT substr(firstname || ' ' || lastname, 1, 4) --> note 4
將會成功。
該怎么辦? 不要將其用作 IN OUT 參數; 有兩個 - 一個輸入,一個輸出。
改變
lv_password IN OUT VARCHAR -- max length dynamically set to length of input
到
lv_password IN OUT CLOB -- any length
問題是我隱式地設置了我的局部變量,特別是 lv_password 變量到下面匿名代碼塊中輸入字符串的長度,正如 Littlefoot 所指出的。 解決方案是在匿名代碼塊中定義更長的變量,以便它們可以接收比輸入到過程中更長的字符串。 更正后的代碼如下。
CREATE OR REPLACE
PROCEDURE member_ck
(lv_cust_id IN VARCHAR2,
lv_password IN OUT VARCHAR2,
lv_cookie OUT NUMBER,
p_check OUT VARCHAR2)
AS
BEGIN
SELECT (firstname|| ' ' || lastname), cookie
INTO lv_password, lv_cookie
FROM bb_shopper
WHERE LOWER(lv_cust_id) = LOWER(username)
AND lv_password = password;
DBMS_OUTPUT.PUT_LINE('Name: ' || lv_password || ' Cookie #: ' || lv_cookie);
EXCEPTION
WHEN NO_DATA_FOUND THEN
p_check := 'INVALID';
DBMS_OUTPUT.PUT_LINE('Incorrect login information');
END member_ck;
/
DECLARE
lv_cust_id_1 VARCHAR2(255) := 'rat55';
lv_cust_id_2 VARCHAR2(255) := 'Rat55';
lv_cust_id_3 VARCHAR2(255) := 'rat';
lv_password_1 VARCHAR2(255) := 'kile';
lv_password_2 VARCHAR2(255) := 'steel';
lv_cookie bb_shopper.cookie%TYPE;
p_check VARCHAR2(7);
BEGIN
member_ck(lv_cust_id_1, lv_password_1, lv_cookie, p_check);
lv_password_1 := 'kile';
member_ck(lv_cust_id_2, lv_password_1, lv_cookie, p_check);
lv_password_1 := 'kile';
member_ck(lv_cust_id_3, lv_password_1, lv_cookie, p_check);
member_ck('Kids2', lv_password_2, lv_cookie, p_check);
END;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.