我正在学习一些关于pl / sql的知识,因为我正在研究一个程序,我想是否有可能做这样的事情:
create or replace procedure lCProcedure(c_tables in varchar, cl_cursor OUT SYS_REFCURSOR)
is
begin
open cl_cursor for
select * from c_tables;
end lCProcedure;
然后我会做这样的事情:
例如: lCProcedure(客户,cur); lCProcedure(存储,cur); ...
每个人都提供有关我要求的表格的所有信息。有可能吗?
答案 0 :(得分:2)
create or replace procedure lCProcedure(
c_table in varchar2,
cl_cursor OUT SYS_REFCURSOR
)
is
begin
-- Don't do this!!
open cl_cursor for
'select * from ' || c_tables;
end lCProcedure;
你应该吗?几乎肯定不是。动态SQL是一个非常强大的工具,但它相对容易滥用。拥有可以查询任何表的单个存储过程使得无法通过正常授权使用管理安全性。它消除了为应用程序提供定义的API的好处,这些应用程序在数据模型发展时可以保持一致。出于同样的原因,它通过强制调用者知道底层数据模型中的所有表,消除了过程API应该提供的封装优势。如果你像我在这里建立一个天真的实现,你就会受到SQL注入攻击。