2016-01-05 4 views
1

Я создал следующий запрос. Однако, я получил ошибку ниже. Я думаю, что ошибка связана с TO_CHAR («AND MARITAL_STATUS» в строке «Женатый-гражданский супруг»). Как я могу определить другие способы? Спасибо заранее.Ожидаемый PLSQL один из следующих

Error: 
PLS-00103: Encountered the symbol ") " when expecting one of the following: 

. () , * @ % & = - + </> at in is mod remainder not rem => 
<an exponent (**)> <> or != or ~= >= <= <> and or like like2 
like4 likec between || member 
06550. 00000 - "line %s, column %s:\n%s" 

Это мой код:

SET SERVEROUTPUT ON; 
DECLARE 
KATSAYI1 VARCHAR2(1000):=TO_CHAR('CREATE TABLE DQ_DNM2 AS SELECT * FROM DQ_TEST_DATA WHERE YEARMONTH='); 
KATSAYI2 varchar2(100) := TO_CHAR(sysdate,'YYYY'); 
KATSAYI3 VARCHAR2(100) := TO_CHAR(KATSAYI2-2); 
KATSAYI4 varchar2(100) := to_char(sysdate, 'MM'); 
KATSAYI7 varchar2(100) := to_char(KATSAYI4 + 11); 
KATSAYI5 varchar2(100) := to_char(CONCAT(KATSAYI3,KATSAYI7)); 
KATSAYI6 VARCHAR2(1000):=TO_CHAR(CONCAT(KATSAYI1,KATSAYI5)); 
KATSAYI8 VARCHAR2(100) :=TO_CHAR(' AND MARITAL_STATUS in ('Married-civ- spouse') '); 
KATSAYI9 varchar2(100) := to_char(CONCAT(KATSAYI6,KATSAYI8)); 
BEGIN 
dbms_output.put_line(KATSAYI5); 
DBMS_OUTPUT.PUT_LINE('İlgili tablo yaratıldı.'); 
EXECUTE IMMEDIATE KATSAYI9; 
END; 

/код здесь

+1

Распечатайте сгенерированный SQL (' KATSAYI9'), а затем отредактируйте свой вопрос и добавьте его (но, скорее всего, вы уже увидите ошибка для себя тогда) –

+2

Использовать двойные кавычки: TO_CHAR ('AND MARITAL_STATUS in (' 'Married-civ-spus' ')'); 'или, предпочтительнее, использовать переменные связывания. – MT0

ответ

0

Вы, кажется, берет 2 от лет и добавления 11 месяцам (так что по сути взлетает 13 месяцев) :

SET SERVEROUTPUT ON; 

DECLARE 
    p_yyyymm char(6) := TO_CHAR(ADD_MONTHS(SYSDATE, -13), 'YYYYMM'); 
BEGIN 
    DBMS_OUTPUT.PUT_LINE(p_yyyymm); 
    DBMS_OUTPUT.PUT_LINE('İlgili tablo yaratıldı.'); 
    EXECUTE IMMEDIATE 'CREATE TABLE DQ_DNM2 AS SELECT * FROM DQ_TEST_DATA WHERE YEARMONTH=''' || p_yyyymm || ''' AND MARITAL_STATUS in (''Married-civ- spouse'')'; 
END; 
+0

Безопаснее использовать' add_months() ' (с отрицательным значением) вместо вычитания интервала. Рассмотрим разницу между: 'date '2015-03-30' - interval '1' month' и' add_months (date '2015-03-30', -1) ' –

1

Использование chr(39) вместо '

select 'That'||chr(39)||'s the right way' from dual 

даст вам

Это правильный путь

Вы можете использовать q'[ ]' избежать всех персонажей и новые линии

Пример:

select q'[That's the right way also "" '' [email protected]#$%^&*()_=+ 

anything you want... ]' from dual 

Это правильный путь также "" ''! @ # $%^& *() _ = +

все, что вы хотите ...

Этот подход хорош для динамического выполнения кода , где вам не нужно беспокоиться об исключении переменных и конкатенаций; вы просто пишете свой код в том же формате, что и будет выполняться. лучше в читабельности вашего кода.

+2

или просто используйте '' '' – MT0

+0

@ MT0, оба работают, и есть даже третий способ, см. Мое редактирование. – simsim

+0

. Редактированный ответ лучше для динамического кодирования, где вам нужно избежать конкатенации переменных и всех специальных символов – simsim

0

Спасибо за ваши ответы. Использование двойных кавычек в этом случае. Прежде чем открывать этот поток, я попытался использовать («). Не используйте это. Используйте двойные кавычки.

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