ORACLE:如何根据参数创建动态更新程序?
ORACLE : how to create dynamic update procedure depending on parameters?
我想更新 table 列的更新过程取决于参数。
是否可以根据输入参数更新字段?
这是我制作的示例程序:
CREATE OR REPLACE PROCEDURE procedure(parameter in varchar2)
IS errormessage varchar2(255);
BEGIN
UPDATE table
SET table.parameter = 'newvalue'
END;
而且它不起作用。
请帮忙
编辑:已处理 SQL 注入场景。
您需要 execute immediate
,因为 parameter
将用作列名。
注意:请记住您是 运行 没有 where 子句的更新语句,它将更新所有行。
您也不能传递数字列名,因为值 newvalue
是一个字符串。所以如果你想处理它,那么使用 if else 条件并在 运行 更新语句之前检查列数据类型。
CREATE OR REPLACE PROCEDURE proc12(column_name in varchar2)
IS
v_count integer;
BEGIN
select count(*) into v_count from (select column_name as txt from dual) where regexp_like (txt,'[,|=|;]');
if v_count =0 then
execute immediate 'UPDATE tbl1 SET '||column_name||' = ''newvalue''';
else
dbms_output.put_line('SQL Injection detected. Exiting');
end if;
END;
select * from tbl1;
+------+
| col1 |
+------+
| abc |
| pqr |
| xyz |
+------+
call proc12('col1');
select * from tbl1;
+----------+
| col1 |
+----------+
| newvalue |
| newvalue |
| newvalue |
+----------+
call proc12('balance=10000, col1');
SQL Injection detected. Exiting
我想更新 table 列的更新过程取决于参数。
是否可以根据输入参数更新字段?
这是我制作的示例程序:
CREATE OR REPLACE PROCEDURE procedure(parameter in varchar2)
IS errormessage varchar2(255);
BEGIN
UPDATE table
SET table.parameter = 'newvalue'
END;
而且它不起作用。 请帮忙
编辑:已处理 SQL 注入场景。
您需要 execute immediate
,因为 parameter
将用作列名。
注意:请记住您是 运行 没有 where 子句的更新语句,它将更新所有行。
您也不能传递数字列名,因为值 newvalue
是一个字符串。所以如果你想处理它,那么使用 if else 条件并在 运行 更新语句之前检查列数据类型。
CREATE OR REPLACE PROCEDURE proc12(column_name in varchar2)
IS
v_count integer;
BEGIN
select count(*) into v_count from (select column_name as txt from dual) where regexp_like (txt,'[,|=|;]');
if v_count =0 then
execute immediate 'UPDATE tbl1 SET '||column_name||' = ''newvalue''';
else
dbms_output.put_line('SQL Injection detected. Exiting');
end if;
END;
select * from tbl1;
+------+
| col1 |
+------+
| abc |
| pqr |
| xyz |
+------+
call proc12('col1');
select * from tbl1;
+----------+
| col1 |
+----------+
| newvalue |
| newvalue |
| newvalue |
+----------+
call proc12('balance=10000, col1');
SQL Injection detected. Exiting