在PLSQL中连接String的问题

时间:2016-01-28 09:09:39

标签: oracle plsql

我正在尝试创建动态sql字符串。当我写这个

DECLARE
    update_column VARCHAR2(20) := 'RED';
    update_statement VARCHAR2(50);

BEGIN
 -- update_column := 'RED';
    update_statement := 'UPDATE HEARTBEAT_REPORTING_DAILY SET '|| 
    UPDATE_COLUMN || ' = ' || UPDATE_COLUMN || ' + 20';   
    DBMS_OUTPUT.PUT_LINE(update_statement);
END;

我收到此错误

Error starting at line 3 in command:
DECLARE
update_column VARCHAR2(20) := 'RED';
update_statement VARCHAR2(50);
BEGIN
    update_statement := 'UPDATE HEARTBEAT_REPORTING_DAILY SET '|| 
    UPDATE_COLUMN || ' = ' || UPDATE_COLUMN || ' + 20';
    DBMS_OUTPUT.PUT_LINE(update_statement);
END;
Error report:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 5
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    
*Action:

但是当我这样做时

DECLARE
    update_column VARCHAR2(20) := 'RED';
    update_statement VARCHAR2(50);

BEGIN
 -- update_column := 'RED';
    update_statement := 'UPDATE HEARTBEAT_REPORTING_DAILY SET '|| 
    UPDATE_COLUMN || ' = ' || UPDATE_COLUMN ||' +20';   
    DBMS_OUTPUT.PUT_LINE(update_statement);
END;

它完美运行。这是输出

UPDATE HEARTBEAT_REPORTING_DAILY SET RED = RED +20

请注意,前一个“+”和“20”之间有空格,第二个空格中没有空格。为什么会这样?

2 个答案:

答案 0 :(得分:3)

在第一种情况下,您的字符串长度为51个字符,不适合endpoint变量。

在第二种情况下,在" 20"之前有一个空格。所以字符串长度只有50个字符。

将变量增加到合适的长度:

VARCHAR2(50)

答案 1 :(得分:1)

update_statement := 'UPDATE HEARTBEAT_REPORTING_DAILY SET '|| 
    UPDATE_COLUMN || ' = ' || UPDATE_COLUMN || ' + 20';

以上行使update_statement大小为51,但您已将update_statement指定为50.这就是原因。

update_statement := 'UPDATE HEARTBEAT_REPORTING_DAILY SET '|| 
    UPDATE_COLUMN || ' = ' || UPDATE_COLUMN || ' +20';

在这种情况下,它的大小正好是50,所以它接受了。