2016-09-27 3 views
1

У меня есть таблица ниже:ORA-01007: переменная не выберите список-1007

CREATE TABLE req1_tb(TableName VARCHAR2(43), 
        ColumnName VARCHAR2(98), 
        Edit_ind CHAR) 

Вот DML для этой таблицы:

insert into req1_tb VALUES('Employees','employee_id','Y'); 
insert into req1_tb VALUES('Employees','first_name','Y'); 
insert into req1_tb VALUES('Employees','last_name','N'); 
insert into req1_tb VALUES('Employees','email','N'); 
insert into req1_tb VALUES('Employees','job_id','N'); 
insert into req1_tb VALUES('Employees','salary','Y'); 
insert into req1_tb VALUES('Employees','commission_pct','Y'); 
insert into req1_tb VALUES('Employees','hire_date','N'); 
insert into req1_tb VALUES('Employees','department_id','Y'); 

Я предположил, что столбец edit_ind в enter code here ниже таблице будет динамически изменяться

SQL> SELECT * FROM REQ1_TB; 

TABLENAME         COLUMNNAME  EDIT_IND 
------------------------------------------- --------------- ---------- 
Employees         employee_id  Y 
Employees         first_name  Y 
Employees         last_name  N 
Employees         email   N 
Employees         job_id   N 
Employees         salary   Y 
Employees         commission_pct Y 
Employees         hire_date  N 
Employees         department_id Y 

Я создал процедуру, которая будет динамически печатать столбцы, которые Заметное «Y» только:

CREATE OR REPLACE PROCEDURE dyn_sql_sp 
AS 
    cols  VARCHAR2(2000); 
    v_cols VARCHAR2(2000); 
    cls  VARCHAR2(2000); 
    v_employee_id number; 
    emp  employees%rowtype; 
    cnt  number; 
cursor tab_c 
is 
    select columnname from req1_tb 
    where EDIT_IND='Y'; 
cursor col_c 
is 
    select employee_id from employees; 
BEGIN 
for i in tab_C 
loop 
cols:=cols||'emp.'||i.columnname||','; 
end loop; 
cols:=rtrim(cols,','); 
for i in col_c 
loop 
EXECUTE IMMEDIATE 'SELECT ' || cols || ' FROM employees WHERE employee_id = :1' 
INTO emp 
USING i.employee_id; 
end loop; 
dbms_output.put_line(cols); 
    Exception 
    When Others Then 
    dbms_output.put_line(sqlerrm||sqlcode); 
    end; 
/

При выполнении я получил следующее сообщение об ошибке:

SQL> exec dyn_sql_sp; 
ORA-01007: variable not in select list-1007 
+0

Как выглядит таблица ваших сотрудников? Он получил все эти столбцы в нем и находится ли он в схеме emp? – DaveRlz

ответ

1

В вашей процедуре ниже код будет создавать проблемы. Насколько я понимаю, вы пытаетесь выбрать columns таблицы employee в зависимости от 'Y' flag from table req1_tb.

Проблемная Часть:

for i in col_c 
loop 
EXECUTE IMMEDIATE 'SELECT ' || cols || ' FROM employees WHERE employee_id = :1' 

--***The INTO clause is problematic here. Since the you select list is not*** having all the columns same as your cursor variable. 
INTO emp 

USING i.employee_id; 
end loop; 

Теперь, вы не пытаетесь той же логикой при объявлении переменного для хранения данных, возвращаемых из этих выбранных столбцов в Execute Immediate заявления.

Для этого объявление переменной должно быть динамическим. Таким образом, вы декларация

emp employees%rowtype;

должна быть такой, чтобы она также есть все выбранные столбцы, удовлетворяющие условию флаг 'Y'. Вы не можете вставить несколько столбцов, выбранных из оператора select, в переменную курсора, имеющую все столбцы.

+1

Также необходимо добавить псевдоним «emp» в таблицу сотрудников как «emp». префикс для всех столбцов в столбцах. ** EXECUTE IMMEDIATE 'SELECT' || cols || 'От сотрудников emp WHERE employee_id =: 1' ** – hemalp108