Stored procedures Oracle-动态选择过程
我需要一个带有动态select语句的存储过程,在我的例子中,只需要在select中添加所需的列名。这是我创建的,但我不确定SQL注入是否安全: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
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;
这看起来比我的代码好一点,谢谢。虽然这不是一个简单的问题;