2016-01-28 3 views
0

Я пытаюсь создать динамическую строку sql. Когда я пишу этотПроблема в конкатенации строки в PLSQL

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

Я подсчитал 48 символов, но, возможно, вы могли бы увеличить длину update_statement и посмотреть, как вы справляетесь. – AntDC

+0

Я пробовал ваш код и получил ошибку: 'ORA-06502: PL/SQL: числовая или значащая ошибка: буфер символьной строки слишком мал ORA-06512: в строке 6' ... так ... varchar (50) - тоже маленький .. увеличьте его до 250 решает вашу проблему – are

+0

Спасибо всем !!! –

ответ

3

В первом случае ваша строка длиной 51 символ и не вписывается в переменную VARCHAR2(50).

Во втором случае пространство меньше «20». Таким образом, строка содержит всего 50 символов и подходит.

увеличить переменный к хорошей длине:

update_statement VARCHAR2(200); 
+0

спасибо большое !!! –

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, поэтому его принятие.

Смежные вопросы