Stored procedures Oracle-动态选择过程

Stored procedures Oracle-动态选择过程,stored-procedures,oracle11g,Stored Procedures,Oracle11g,我需要一个带有动态select语句的存储过程,在我的例子中,只需要在select中添加所需的列名。这是我创建的,但我不确定SQL注入是否安全: CREATE OR REPLACE PROCEDURE MySchema.Search( columns IN VARCHAR2, res_out OUT SYS_REFCURSOR) IS BEGIN OPEN res_out FOR 'SELECT ' || columns ||' FROM MySchema.Table1'; END Sea

我需要一个带有动态select语句的存储过程,在我的例子中,只需要在select中添加所需的列名。这是我创建的,但我不确定SQL注入是否安全:

CREATE OR REPLACE PROCEDURE MySchema.Search(
columns IN VARCHAR2,
res_out OUT SYS_REFCURSOR)

IS
BEGIN
 OPEN res_out FOR
 'SELECT ' || columns ||' FROM MySchema.Table1';

END Search;

这样好还是不安全?当阅读所有的例子时,我没有注意到任何像这样简单的事情,但它是有效的。如果SQL注入不安全,请告诉我应该怎么做。提前谢谢你的帮助

我建议您像这样使用PL/SQL:在下面的PL/SQL中,它确保,如果任何SQL注入语句试图调用,它将停止

CREATE OR REPLACE PROCEDURE MySchema.Search(
columns IN VARCHAR2,
res_out OUT SYS_REFCURSOR)

IS
v_columns VARCHAR2(4000);
BEGIN
select listagg(column_name,',') within group(order by 1)
  INTO v_columns
  from all_tab_columns
 where owner = 'MYSCHEMA'
   and table_name = 'TABLE1'
   and column_name in (select regexp_substr(columns,'[^,]+', 1, level)
                         from dual
                      connect by regexp_substr(columns, '[^,]+', 1, level) is not null
                      );

 OPEN res_out FOR
 'SELECT ' || v_columns ||' FROM MySchema.Table1';

END Search;

这看起来比我的代码好一点,谢谢。虽然这不是一个简单的问题;