我正在尝试创建动态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”之间有空格,第二个空格中没有空格。为什么会这样?
答案 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,所以它接受了。