PL/SQL 存储过程的动态表名
PL/SQL dynamic tablename for stored procedure
我已经开始学习 PL SQL 存储过程,我有 2 个有趣的问题要问。
在下面的示例中,我 execute employer_details
和 return 员工的 ID 和姓名(如果找到的话)。一切正常,但这个过程不是动态的,而是 table 具体的
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)
我试过了,但出现 "table or view does not exist" 错误(我正在使用 Oracle/Toad)
第二个问题:我们能否将所有列都视为输出,
dbms_output.put_line(employee.id || ' ' ||employee.name); (point 2)
不仅2列而且所有列(*)
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;
我想这就是你想要的。
- 是的,我们可以。查看 OPEN FOR 子句。
- 是的,我们可以。查看DBMS_SQL包。
- 不,我们不应该没有充分理由这样做。通常这是不好的做法。
我已经开始学习 PL SQL 存储过程,我有 2 个有趣的问题要问。
在下面的示例中,我 execute employer_details
和 return 员工的 ID 和姓名(如果找到的话)。一切正常,但这个过程不是动态的,而是 table 具体的
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)
我试过了,但出现 "table or view does not exist" 错误(我正在使用 Oracle/Toad)
第二个问题:我们能否将所有列都视为输出,
dbms_output.put_line(employee.id || ' ' ||employee.name); (point 2)
不仅2列而且所有列(*)
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;
我想这就是你想要的。
- 是的,我们可以。查看 OPEN FOR 子句。
- 是的,我们可以。查看DBMS_SQL包。
- 不,我们不应该没有充分理由这样做。通常这是不好的做法。