存储过程的PL / SQL动态表名

时间:2015-01-13 12:14:44

标签: oracle stored-procedures plsql oracle11g

我已经开始学习PL SQL存储过程了,我有两个有趣的问题要问。 在下面的示例I execute employer_details中,如果找到,则返回员工的ID和姓名。一切都运行正常,但这个程序不是动态的,而是特定于表格的

CREATE OR REPLACE PROCEDURE employer_details 
IS 
CURSOR table_cur IS
SELECT id, name FROM employee where id in(12,23,34); -- point 1
table_rec table_cur%rowtype;
BEGIN
OPEN table_cur;
LOOP 
fetch table_cur into table_rec;
EXIT WHEN table_cur%notfound;
dbms_output.put_line(employee.id || ' ' ||employee.name); -- point 2
END LOOP;
END;
/

第一个问题:我们可以通过以下签名使其动态化

CREATE OR REPLACE PROCEDURE employer_details (tablename IN VARCHAR, ID in INTEGER, target IN INTEGER)

更改程序中的行

SELECT * FROM tablename where tablename.ID > target  ; (point 1)

我试了但是“表或视图不存在”错误显示(我正在使用Oracle / Toad)

第二个问题:我们可以将所有列视为输出,

dbms_output.put_line(employee.id || ' ' ||employee.name); (point 2)

不仅有2列,还有所有列(*)

2 个答案:

答案 0 :(得分:1)

create table my_poc
(id INTEGER,
name VARCHAR2(60),
 sal  number);

insert into my_poc values (1,'abc',1000);
insert into my_poc values (2,'abc',2000);
insert into my_poc values (3,'abc',3000);
insert into my_poc values (4,'abc',4000);
insert into my_poc values (5,'abc',5000);
insert into my_poc values (6,'abc',6000);



CREATE OR REPLACE PROCEDURE employer_details (p_id INTEGER,filter VARCHAR2,table_name varchar2, out_param out SYS_REFCURSOR)
IS
BEGIN
OPEN out_param for 'select * from '||table_name||' where '||filter||' > '||p_id;
END;

我认为这就是你想要的。

答案 1 :(得分:0)

  1. 是的,我们可以。看看OPEN FOR条款。
  2. 是的,我们可以。看看DBMS_SQL包。
  3. 不,我们不应该没有充分理由这样做。一般来说这是不好的做法。