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