2016-09-26 101 views
0

我有一個名爲req_tb甲骨文plsql的光標錯誤

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

我正在插入值表作爲

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

現在我的表如下

SQL> SELECT * FROM REQ_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 

考慮列edit_ind正在改變動態地在表req_tb中,我想只打印製作爲'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 req_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 
SELECT * into emp from employees 
where employee_id=i.employee_id; 
dbms_output.put_line(cols); 
end loop; 
Exception 
When Others Then 
dbms_output.put_line(sqlerrm||sqlcode); 
end; 
/

我預期的輸出爲

100 Steven     24000       90 
101 Neena      17000       90 
102 Lex      17000       90 
103 Alexander     9000       60 
104 Bruce      6000       60 
105 David      4800       60 
106 Valli      4800       60 
107 Diana      4200       60 

輸出即時得到是

SQL> exec dyn_sql_sp; 
emp.employee_id   ||emp.first_name    ||emp.salary     ||emp.commission_pct ||emp.department_id 
emp.employee_id   ||emp.first_name    ||emp.salary     ||emp.commission_pct ||emp.department_id 
emp.employee_id   ||emp.first_name    ||emp.salary     ||emp.commission_pct ||emp.department_id 
emp.employee_id   ||emp.first_name    ||emp.salary     ||emp.commission_pct ||emp.department_id 
emp.employee_id   ||emp.first_name    ||emp.salary     ||emp.commission_pct ||emp.department_id 
emp.employee_id   ||emp.first_name    ||emp.salary     ||emp.commission_pct ||emp.department_id 
emp.employee_id   ||emp.first_name    ||emp.salary     ||emp.commission_pct ||emp.department_id 
emp.employee_id   ||emp.first_name    ||emp.salary     ||emp.commission_pct ||emp.department_id 
emp.employee_id   ||emp.first_name    ||emp.salary     ||emp.commission_pct ||emp.department_id 
emp.employee_id   ||emp.first_name    ||emp.salary     ||emp.commission_pct ||emp.department_id 
emp.employee_id   ||emp.first_name    ||emp.salary     ||emp.commission_pct ||emp.department_id 

什麼是錯

回答

0

現在的問題是:

for i in col_c 
loop 
SELECT * into emp from employees 
where employee_id=i.employee_id; 
dbms_output.put_line(cols); 
end loop; 

您正在從employes表中選擇所有*(因此每一列),並且您從未使用它。你想要的只是選擇cols變量中的列。要做到這一點,你應該使用動態聲明,像這樣:

EXECUTE IMMEDIATE 'SELECT ' || cols || ' FROM employees WHERE emplyee_id = :1' 
INTO emp 
USING i.employee_id 

但是,那麼還有另一個問題。遊標emp從動態語句中得到的類型不是employees%rowtype(列數不同),所以動態語句會失敗。

幸運的是,似乎DBMS_SQL包可以幫助你。請看這篇文章:https://community.oracle.com/thread/702648,那裏你應該找到解決這個問題的方法。