2016-07-28 5 views
1

Я пытаюсь вставить случайные порождающего данные в таблицу, вот код»Oracle, выполнение Немедленное Вставьте

begin 
    FOR x in 1..300 LOOP 
    Execute immediate 'insert into emp values ('||prac_seq.nextval||','''||'name'||x||''','||trunc(dbms_random.value(1,300))||');'; 
    end loop; 
/

таблица emp имеет 3 колонки - id, name, idmgr;

выше запроса в казнить немедленное заявление выглядит так:

insert into emp values (13,'name25',193); 

Этот блок не запускался. Когда я попытался запустить single execute сразу e (т. е.

begin 
    Execute immediate 'insert into emp values ('||prac_seq.nextval||','''||'name23'','||trunc(dbms_random.value(1,300))||');' 
end; 
    /

ORA дает мне ошибку:

Execute immediate 'insert into emp values ('||prac_seq.nextval||','''||'name23'','||trunc(dbms_random.value(1,300))||');'; end; Error report: ORA-00911: invalid character ORA-06512: at line 3 00911. 00000 - "invalid character" *Cause: identifiers may not start with any ASCII character other than letters and numbers. $#_ are also allowed after the first character. Identifiers enclosed by doublequotes may contain any character other than a doublequote. Alternative quotes (q'#...#') cannot use spaces, tabs, or carriage returns as delimiters. For all other contexts, consult the SQL Language Reference Manual. *Action:

А почему? Запятые, цитаты .. все проверено и прекрасно.

+1

В этом случае нет необходимости использовать собственный динамический SQL ('execute instant') - используйте статический SQL. –

+0

Перед немедленным использованием JUSt 2000 вставляются в операторы. Это занимает много времени. С динамическим SQL - 7.54 сек! Так что да - есть необходимость. –

ответ

1

Попробуйте удалить ; из вашего динамического запроса.

+0

Глупо ... Я был настолько сосредоточен на этих запятых, что пропустил это. Благодаря!! –

3

Почему вы используете для этого немедленное выполнение. Попробуйте подключиться по уровню.

select prac_seq.nextval, 'name'||level, trunc(dbms_random.value(1,300)) as rnd 
from dual 
connect by level <= 300; 
+1

Ницца. Благодаря! Но все-таки - почему есть ошибка? –

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