2016-09-27 1176 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

在你的程序中下面的代码将创建问题。据我了解,您正试图选择表employeecolumns,具体取决于表req1_tb中的'Y'标志。

有问题的部分:

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”。以cols中的所有列作为前缀。 ** EXECUTE IMMEDIATE'SELECT'|| cols || 'FROM employees emp WHERE employee_id =:1'** – hemalp108