2017-01-09 2 views
-1

У меня есть вид t со мной, у которого есть столбец для имени таблицы и другой столбец, в котором есть условие условия.введите имя таблицы из столбца из раздела

id| name|table_in| where_clause 

    1 | Sam | t1 | age = 22 

    2 | John| t2 | age = 23 and sex = 'male' 

и так далее ...

Теперь, я поставил записи в курсоре, и я хочу, чтобы запустить каждый запрос.

create or replace procedure create_cursor 
    is 

    CURSOR v_records is 
    select * from t ; 

    begin 

    FOR temp IN v_records LOOP 
     INSERT INTO myTable (id, name) 
     select temp.id, temp.name 
     from temp.table where temp.where_clause; 

     END LOOP; 


    end; 
    /

myTable - это еще одна таблица, в которой я хочу поместить записи для следующей цели.

+0

Просьба уточнить ваше требование. Возможны две интерпретации этого кода. – APC

ответ

3

@Akshay,

Пожалуйста, найдите код ниже для справки.

Create or replace procedure create_cursor is 
l_statement varchar2(32767); 
cursor v_records is 
    select * from t; 
begin 
for temp in v_records 
loop 
    l_statement := 'INSERT INTO myTable (id, name) select '||temp.id||',' 
    ||temp.name|| ' from ' || temp.table1 
    || ' where ' || temp.where_clause; 

    execute immediate l_statement; 
    end loop; 
end; 
/
+0

Он допустил синтаксическую ошибку. Пожалуйста, проверьте комментарий, данный akshay. Он сказал, что есть ошибка «Недостающие ценности». Поэтому я редактировал. Пожалуйста, проверьте, прежде чем отправлять комментарии и голосовать. –

+0

Я уже сделал это изменение в своем sql, поэтому я не упоминал об этом. Проблема в том, что процедура не выполняется. – Akshay

+1

@APC Надеюсь, вы знаете, как запускать и компилировать PLSQL. Перед публикацией, что код не работает, проверьте и запустите код с действительными данными. Узнайте, как установить данные для запуска кода plsql. Если вы не делаете этого, выполнить код непросто. Также редактирование других сообщений, основанных на моей, не является этическим. научиться понимать plsql, а затем публиковать комментарии. Приветствия. Пожалуйста, найдите снимок экрана ниже. –

3

Вам нужно динамический SQL, чтобы сделать это:

CREATE OR REPLACE PROCEDURE create_cursor 
IS 
    l_statement VARCHAR2(32767); 
    CURSOR v_records 
    IS 
    SELECT * FROM t; 
BEGIN 
    FOR temp IN v_records 
    LOOP 
    l_statement := 'INSERT INTO myTable (id, name) 
      select id, name from ' || temp.table || 
      ' where ' || temp.where_clause; 
    EXECUTE immediate l_statement; 
    END LOOP; 
END; 
/
+0

это дает мне ошибку в строке выполнения и говорит «Missing VALUES KEYWORD» – Akshay

+0

Выведите инструкцию перед ее исполнением и посмотрите, как она выглядит. Возможно, я где-то сделал синтаксическую ошибку. Хотя это выглядит хорошо для меня. – Rene

+0

'name' будет что-то вроде« Сэм »или« Джон », поэтому ему понадобятся кавычки. Однако я ожидал бы увидеть «ORA-00904:« Сэм »: недопустимый идентификатор». Это, вероятно, тривиально для исправления, если вы отправляете сгенерированную инструкцию INSERT, которая не работает. –

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