簡體   English   中英

將兩個字符串合並為一個文本變量 PL/SQL SQL Developer

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM